0

我正在搜索正斜杠之间带有数字的子字符串(例如 /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

4 回答 4

1

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

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

另一种解决方案是使用前瞻和后视

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));
}
于 2013-04-26T07:12:05.163 回答
0

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

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

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

另请注意,您的代码将无法运行,8/5/4/3因为8无法匹配,因为它/之前没有,4无法匹配,因为5使用了/中间,并且3无法匹配,因为它没有/之后。您需要包括检查字符串开头 ( ^)8和字符串结尾 ( $)3并使用前瞻(?=...)for 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));
}

正则表达式参考

测试

于 2013-04-26T07:22:27.770 回答
0

我认为你需要这样做,因为你只需要number那些slashes.

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

group(0) - 给出整个匹配(/n/)

group(1) - 给你第一个斜线(/)

group(2) - 给你号码(n)

group(3) - 给你第二个斜线(/)

于 2013-04-26T07:11:09.557 回答
0

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

于 2013-04-26T07:15:37.960 回答