2009-09-01 111 views
0

我试图让一个正则表达式来解决下一个问题:Java的正则表达式的问题

我有一些字符串的下一个格式为“20 somename 1和别的”我想从检索“1”字符串

我与

Pattern pat = Pattern.compile("(?<!of\\s)(\\d+)\\s", Pattern.CASE_INSENSITIVE); 
Matcher matcher = pat.matcher(tmp); 

努力但正如我所期待的不工作。

的“somename”字符串也可以包含数字,所以基本逻辑应该是“前拿到最后一个数字‘的’”

任何提示?

谢谢。

回答

2

你的意思是你想要匹配“x of y”?试试这个:

\\b(\\d+)\\s+of\\s+(\\d+) 
+0

非常感谢。这正是我需要的:) – 2009-09-02 16:53:59

0

这似乎为简单的测试情况下工作,但也有可能是一些极端情况(一个或多个)不包括:

Pattern pat = Pattern.compile(".* (\\d+) of \\d+.*", Pattern.CASE_INSENSITIVE); 
String tmp = "somename 1 of 20 and something else"; 
Matcher matcher = pat.matcher(tmp); 
if (matcher.matches()) { 
    System.out.println(matcher.group(1)); 
} 
0

你的模式工作正常。你需要记住的一件事是你需要正确初始化Matcher。从Matcher JavaDoc

匹配器的显式状态最初是未定义的;试图在成功匹配之前查询它的任何部分将导致抛出IllegalStateException。每个匹配操作都会重新计算匹配器的显式状态。

String tmp= "somename 1 of 20 and something else"; 
Pattern pat = Pattern.compile("(?<!of\\s)(\\d+)\\s"); 
Matcher matcher = pat.matcher(tmp); 
System.out.print(matcher.find()); //matcher.find() will initialize state 
System.out.println(":" + matcher.group(1)); 

将返回:

真:1个