我有一个我应该维护的代码库的代码片段。
String number = "1";
String value = "test";
String output = "";
output = value.replaceAll("\\Q{#}", number);
output
的值保持为“test”,我只能猜测这段代码应该做什么:number
的值应该附加到值(value)。也许是这样的:test1
或将值完全替换为数字。
我发现 \\Q
是正则表达式选项,用于引用 \\E
之前的所有内容,但没有 \\E
。无论如何,它根本没有做任何事情,我想知道我是否监督了一些事情?
最佳答案
您的正则表达式仅匹配文字{#}
。确实,在 \Q
之后,模式被认为具有文字符号(\Q
之后的所有符号都被“引用”或“转义”),并且 \E
停止这种转义/引用,如果缺少它,整个模式将被引用/转义。
如果您的value变量包含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 可以轻松猜测,因为内部没有数字,所以它不是限制/绑定(bind)量词)。
关于java - 用参数/标记替换正则表达式字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37539971/