我正在尝试匹配字符串中的两个或更多单词。字符串为My/word example/word
我要提取My example
。我到目前为止所做的是:
String test = "My/word example/word";
Pattern pattern = Pattern.compile("((.*)\\/word){2,}");
Matcher match = pattern.matcher(test);
if (match.find()) {
System.out.println(match.group(1));
}
但它只打印example/word
,有任何想法吗?
答案 0 :(得分:4)
如果您对捕获组有任何重复,它将仅捕获该组的最终匹配。这里你最好的选择是简化正则表达式只匹配一个单词,然后重复使用match.find()
,直到找不到匹配项:
String test = "My/word example/word";
Pattern pattern = Pattern.compile("(\\w+)/word");
Matcher match = pattern.matcher(test);
while (match.find()) {
System.out.println(match.group(1));
}
如果您找到两个或更多匹配项,那么在此处添加一些逻辑并不难打印。
另请注意,我修改了你的正则表达式,正斜杠不需要转义,我将.*
替换为\w+
这应该更好,因为你不会贪婪地匹配到最后/word
。
答案 1 :(得分:1)
您可以对/word
部分使用被动组,并迭代匹配的结果以构建最终字符串。
String test = "My/word example/word";
Pattern pattern = Pattern.compile("(\\w*)(?:\\/word)");
Matcher match = pattern.matcher(test);
String result = "";
while (match.find()) {
result += match.group(1) + " ";
}
System.out.println(result.trim());
输出将是:
My example
答案 2 :(得分:0)
您可以使用非贪婪的* -operator:
((.*?)\/word)
答案 3 :(得分:0)
您是否可能使用了错误的组号?我认为如果您使用group(2)