Java - Regex:相同字符串中的几个匹配项

时间:2013-12-09 15:56:57

标签: java regex

我有一个字符串:String s = "The input must be of format: '$var1$'-'$var1$'-'$var1$'"

我想用$替换另一个文本之间的文本,因此结果可能会在控制台上看起来像:
"The input must be of format: '$REPLACED$'-'$REPLACED$'-'$REPLACED$'"

我来到s.replaceAll("\\$.+\\$", "\\$REPLACED\\$";,但结果是 "The input must be of format: '$REPLACED$'"(第一个和最后一个$被视为边框)。

如何告诉正则表达式引擎,有几个出现并且每个都需要处理(=替换)?

感谢您的帮助!

编辑:// 感谢您的帮助。 “贪婪的事”就是这个问题。在正则表达式中添加?修复了我的问题。解决方案现在看起来像这样(对于那些有类似问题的人):
s.replaceAll("\\$.+?\\$", "\\$REPLACED\\$";

3 个答案:

答案 0 :(得分:5)

您遇到的效果称为贪婪.+之类的表达式将匹配尽可能多的字符。

使用.+?代替表达 ungreedy ,并尽可能少地匹配字符。

答案 1 :(得分:2)

+ 贪婪所以它会尝试找到最大匹配。这意味着[$].+[$]将匹配

a$b$c$e
 ^^^^^

如果您希望.+寻找可能的最小匹配,您可以

  • ?量词+之后添加.+?+不情愿

  • 而不是.之间的每个字符($ $)只接受 $之类的[^$]

因此,请尝试将正则表达式更改为

s.replaceAll("\\$.+?\\$", "\\$REPLACED\\$");

s.replaceAll("\\$[^$]+?\\$", "\\$REPLACED\\$");   

答案 2 :(得分:0)

这应该有效:

String s = "The input must be of format: '$var1$'-'$var1$'-'$var1$'";
System.out.println( s.replaceAll("\\$[^$]*\\$", "\\$REPLACED\\$") );
//=> The input must be of format: '$REPLACED$'-'$REPLACED$'-'$REPLACED$'

使用此正则表达式:\\$[^$]*\\$将匹配文字$然后字符串,直到找到$,然后是文字$