第一个实例与find()方法不匹配

时间:2013-04-26 07:04:36

标签: java regex matcher

我正在搜索带正斜杠之间的数字的子串(例如/ n /),但find()方法总是传递正则表达式的第一次出现。 为什么?我的正则表达式有问题吗?

Pattern p = Pattern.compile("(\\/)(\\d+)(\\/)"); 
Matcher m = p.matcher("A/8/E/5/F/6/G/7/H");
while (m.find()) {
    System.out.println(m.group(0));
}

4 个答案:

答案 0 :(得分:1)

如果您只想打印数字,请使用m.group(2)

System.out.println(m.group(2));

另一种解决方案是使用lookahead and lookbehind

Pattern p = Pattern.compile("(?<=\\/)(\\d+)(?=\\/)");
Matcher m = p.matcher("A/8/E/5/F/6/G/7/H");
while (m.find()) {
    System.out.println(m.group(0));
}

答案 1 :(得分:0)

我认为你需要这样做,因为你只需要number之间的slashes

while (m.find()) {
    System.out.println(m.group(2));
}

组(0) - 提供整个匹配(/n/)

组(1) - 为您提供第一个斜杠(/)

群组(2) - 为您提供号码(n)

群组(3) - 为您提供第二个斜杠(/)

答案 2 :(得分:0)

假设您的意思是使用m,您的群组是'/','8'和'/'。尝试'\ /(\ d +)\ /'仅匹配'8'

答案 3 :(得分:0)

您必须使用group(i)来提取括号中的第i个内容(不包括非捕获组)。

group(0)group()是整个模式。

因此,对于您的示例,您需要group(2)

另请注意,由于8/5/4/3之前没有8/无法匹配,因此您的代码无法在4上运行匹配,因为5使用了/,而3无法匹配,因为它之后没有/。您需要检查^的字符串开头(8)和$的字符串结尾(3),并使用预告(?=...) 4

我还使用了非捕获组(?:...),因此您可以使用group(1)代替group(2)(这是唯一的区别(?:...))。

此外,您无需转义/

最终代码:

Pattern p = Pattern.compile("(?:^|/)(\\d+)(?=/|$)");
Matcher m = p.matcher("8/5/4/3");
while (m.find()) {
    System.out.println(m.group(1));
}

Regular expression reference

Test