Java RegEx问题

时间:2009-09-01 22:32:54

标签: java regex

我正在尝试使用正则表达式来解决下一个问题:

我有一些下一个格式的字符串“somename 1 of 20 and something else”我想从字符串中检索“1”

我正在尝试

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

但是没有像我期待的那样发挥作用。

“somename”字符串也可以包含数字,所以基本上逻辑应该是“获取''之前的最后一个数字”

任何提示?

感谢。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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));
}

答案 2 :(得分: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