我正在尝试替换字符串中单词 true 的所有实例,
例如在"true && 0 || 1"
。
这些字符串可能包含变量值,标记为#{varname}
。
我不想替换#{
和}
包围的实例。
例:
"true && #{ab_true_cd} || 0"
应转换为
"1 && #{ab_true_cd} || 0"
我尝试使用此RegEx:
(?<!\#\{[^\}]*)true
通过使用上面的RegEx我得到以下错误:
Look-behind组在索引13附近没有明显的最大长度
您是否知道解决方案或更好的方法?或者有比使用RegEx更好的方法吗?
我使用http://regexe.com来测试表达式。
答案 0 :(得分:1)
以下是2个带正则表达式的解决方案(Lucas Trzesniewski和TEXHIK的评论中都提到了这些解决方案):
Java代码:
String rx = "(?<!#\\{[^{}]{0,500})\\btrue\\b";
String str = "true && #{ab_true_cd} || 0";
System.out.println(str.replaceAll(rx, "1"));
请参阅demo(输出:1 && #{ab_true_cd} || 0
)
正则表达式(?<!#\\{[^{}]{0,500})\\btrue\\b
匹配任何不在true
之后的整个单词#{
,后跟0或最多500个字符,而不是{
或}
代码:
String s = "true && #{ab_true_cd} || 0";
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("(#\\{[^{}]*})|\\btrue\\b").matcher(s);
while (m.find()) {
if (m.group(1) != null) {
m.appendReplacement(result, m.group(1)); // if a #{} block found, restore it
}
else {
m.appendReplacement(result, "1"); // else, replace true with 1
}
}
m.appendTail(result);
System.out.println(result.toString());
答案 1 :(得分:0)
您可以按&#39;&amp;&amp;&#39;拆分或&#39; ||&#39;,将每个部分与单词&#39; true&#39;进行比较,替换为&#39; 1&#39;,然后再将它们合并