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