我正在尝试使用正则表达式来解决下一个问题:
我有一些下一个格式的字符串“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”字符串也可以包含数字,所以基本上逻辑应该是“获取''之前的最后一个数字”
任何提示?
感谢。
答案 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