我有一个字符串: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\\$";
答案 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$'
使用此正则表达式:\\$[^$]*\\$
将匹配文字$
然后字符串,直到找到$
,然后是文字$