我有我应该维护的代码库的代码片段。
String number = "1";
String value = "test";
String output = "";
output = value.replaceAll("\\Q{#}", number);
output
的值保持为“test”,我只能猜测这段代码应该做什么:number
的值应该附加到值中的值。可能是这样的:test1
或者将值全部替换为数字。
我发现\\Q
是引用所有内容的正则表达式选项,直到\\E
,但没有\\E
。无论如何,它根本没有做任何事情,我想知道我是否监督某事?
答案 0 :(得分:1)
您的正则表达式只与文字{#}
匹配。确实,在\Q
之后,模式被认为具有文字符号(\Q
之后的所有符号都被“引用”或“转义”),而\E
会停止此转义/引用,如果缺少,整个模式将被引用/转义。
如果您的值变量保留test{#}
值,则{#}
将替换为该数字。
请参阅this demo:
String number = "1";
String value = "test{#}";
String output = "";
output = value.replaceAll("\\Q{#}", number);
System.out.println(output); // => test1
请注意,如果没有\Q
,你的正则表达式({#}
)会抛出java.util.regex.PatternSyntaxException: Illegal repetition
错误,因为Java正则表达式引擎不够“智能”,足以消除大括号的歧义(PCRE,JS ,. NET很容易猜到,因为里面没有数字,所以它不是限制/约束量词。)