我需要将以下字符串与Java中的正则表达式匹配:
您好:$ {firstName} $ {lastName}
得到这个:
$ {的firstName}
$ {lastName的}
我试过了:
@Test
public void testRegexMatch() {
String regex = Pattern.quote("${") + ".+" + Pattern.quote("}");
String str = "Hello: ${firstName} ${lastName}";
Matcher m = Pattern.compile(regex).matcher(str);
while (m.find()) {
System.out.println(str.substring(m.start(), m.end()));
}
}
但我得到了以下输出:
$ {firstName} $ {lastName}
答案 0 :(得分:2)
尝试将.+
替换为[^\}]+
。这将匹配尽可能多的非}
字符。
同样重要的是要注意,此方法优于使用非贪婪量词.+?
,因为这将匹配而不进行任何回溯,而非贪婪版本将在括号内每个字符回溯一次。在这种情况下,您可能不会注意到性能损失,但重要的是养成尽可能编写最有效的正则表达式的习惯
答案 1 :(得分:2)
以下内容符合$ {anything}
(\$\{[^\}]+\})
答案 2 :(得分:1)
尝试:
public void testRegexMatch() {
String regex = Pattern.quote("${") + "(.+?)" + Pattern.quote("}");
String str = "Hello: ${firstName} ${lastName}";
Matcher m = Pattern.compile(regex).matcher(str);
while (m.find()) {
System.out.println(m.group(1));
}
}
答案 3 :(得分:1)
+
是一个贪婪的量词,并尽可能多地匹配输入,因此你的正则表达式会匹配到}
的{{1}}。所以,你需要使用${lastName}
这里不情愿的quatifier,它应该可以正常工作。您只需更改第一行代码
?
答案 4 :(得分:0)
String test = "Hello: ${firstName} ${lastName}";
Pattern p = Pattern.compile("\\Q${\\E[a-zA-Z]*\\Q}\\E");
Matcher m = p.matcher(test);
while(m.find()){
System.out.println(m.group());
}
替换
[a-zA-Z]*
随心所欲