我正在搜索带正斜杠之间的数字的子串(例如/ 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));
}
答案 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));
}