用参数/标记替换正则表达式字符串

时间:2016-05-31 07:54:04

标签: java regex string

我有我应该维护的代码库的代码片段。

String number = "1";
String value = "test";
String output = "";

output = value.replaceAll("\\Q{#}", number);

output的值保持为“test”,我只能猜测这段代码应该做什么:number的值应该附加到值中的值。可能是这样的:test1或者将值全部替换为数字。

我发现\\Q是引用所有内容的正则表达式选项,直到\\E,但没有\\E。无论如何,它根本没有做任何事情,我想知道我是否监督某事?

1 个答案:

答案 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很容易猜到,因为里面没有数字,所以它不是限制/约束量词。)