Java正则表达式多个匹配

时间:2018-05-15 20:57:37

标签: java regex regex-greedy

我有以下Java代码段:

Pattern pattern = Pattern.compile("\\$\\{.+\\}");
String str = "str1/${com.test.p1}/str2/${com.test.p2}str3";
int start = 0;
Matcher m = pattern.matcher(str);
while (m.find(start)) {
    System.out.println(m.start());
    System.out.println(m.end());
    start = m.end();
}

我尝试做的是提取括号中的字符串(com.test.p1& com.test.p2)。但是,在执行代码时,输​​出如下:

5
47

,这意味着模式匹配整个序列:

${com.test.p1}/str2/${com.test.p2}

最有可能的情况是,这会导致正则表达式有点贪婪并消耗所有输入,直到它到达最后一个结束括号。我如何重新编写模式,以便它匹配所有这些区域,假设没有固定的数字?

2 个答案:

答案 0 :(得分:0)

正如anubhava所述,您必须使正则表达式变得懒散

\$\{.+?\}

这是正则表达式的工作版本:regexr.com,顺便说一下写/测试和理解正则表达式的好地方:)

答案 1 :(得分:0)

用以下代码替换代码的第一行:

Pattern pattern = Pattern.compile("[a-z0-9]+\\.[a-z0-9]+\\.[a-z0-9]+");

此模式将提取两个字符串com.test.p1& com.test.p2。然后代码的结果将是:

7
18
27
38

对于将来的正则表达式测试,我建议https://regexr.com/