regex 正则表达式替换字符串中的标记{{MARKER}}

s4n0splo  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(88)

我用正则表达式替换{{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]

这取决于基本字符串。如何解决这个问题?

ylamdve6

ylamdve61#

直接的答案是“使用Pattern.QUOTE-你不希望key被解释为regex相关”。
然而,这仍然是一个愚蠢的方式去。为什么你认为这里需要正则表达式?你...别这样。
只需使用.replace(它替换所有出现的情况;.replaceAll将第一个arg解释为regex,与.replaceFirst相反,.replaceFirst也将第一个arg解释为regex,但只替换第一个出现的arg。是的,这些都是命名不当的方法。replace替换所有,不解释,这是你想要的)。通过避免正则表达式,您可以避免一些外来的拒绝服务攻击面,而且通常速度也更快。

String baseString = "any string with marker {{TEST_MARKER}} here. Just to prove the point, {{TEST_MARKER}} again.";
String key = "TEST_MARKER";
String val = "123";
String pattern = String.format("\\{\\{%s\\}\\}", key);
String result = baseString.replace(pattern, val);

或者,也可以查看mustache--一个可以为您完成此任务的库。

相关问题