我正在搜索正斜杠之间带有数字的子字符串(例如 /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));
}
如果您只想打印数字,请使用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));
}
您必须使用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));
}
测试。
我认为你需要这样做,因为你只需要number
那些slashes
.
while (m.find()) {
System.out.println(m.group(2));
}
group(0) - 给出整个匹配(/n/)
group(1) - 给你第一个斜线(/)
group(2) - 给你号码(n)
group(3) - 给你第二个斜线(/)
假设您的意思是使用 m,您的组是“/”、“8”和“/”。尝试 '\/(\d+)\/' 只匹配 '8'