我用正则表达式替换{{MARKER}}
值时遇到了问题。
String baseString = "any string with marker {{TEST_MARKER}} here";
String key = "TEST_MARKER";
String val = "123";
String pattern = String.format("\\{\\{%s\\}\\}", key);
String result = baseString.replaceAll(pattern, val);
它适用于任何baseString
。但有一个例外。如果baseString
包含${some_text}
。
所以我会得到一个错误,如果我使用这样的东西:
String baseString = "any string ${test} with marker {{TEST_MARKER}} here";
结果:
java.lang.IllegalArgumentException: No group with name {test}
at java.base/java.util.regex.Matcher.appendExpandedReplacement(Matcher.java:1059) ~[na:na]
at java.base/java.util.regex.Matcher.appendReplacement(Matcher.java:997) ~[na:na]
at java.base/java.util.regex.Matcher.replaceAll(Matcher.java:1181) ~[na:na]
at java.base/java.lang.String.replaceAll(String.java:2939) ~[na:na]
或:
java.lang.IllegalArgumentException: named capturing group is missing trailing '}'
at java.base/java.util.regex.Matcher.appendExpandedReplacement(Matcher.java:1051) ~[na:na]
at java.base/java.util.regex.Matcher.appendReplacement(Matcher.java:997) ~[na:na]
at java.base/java.util.regex.Matcher.replaceAll(Matcher.java:1181) ~[na:na]
at java.base/java.lang.String.replaceAll(String.java:2939) ~[na:na]
这取决于基本字符串。如何解决这个问题?
1条答案
按热度按时间ylamdve61#
直接的答案是“使用
Pattern.QUOTE
-你不希望key
被解释为regex相关”。然而,这仍然是一个愚蠢的方式去。为什么你认为这里需要正则表达式?你...别这样。
只需使用
.replace
(它替换所有出现的情况;.replaceAll
将第一个arg解释为regex,与.replaceFirst
相反,.replaceFirst
也将第一个arg解释为regex,但只替换第一个出现的arg。是的,这些都是命名不当的方法。replace
替换所有,不解释,这是你想要的)。通过避免正则表达式,您可以避免一些外来的拒绝服务攻击面,而且通常速度也更快。或者,也可以查看mustache--一个可以为您完成此任务的库。