2016-05-31 43 views
1

我有我应该维护的代码库的这段代码片段。用参数/标记替换正则表达式字符串

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

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

output住宿为“测试”的价值,我只能猜测这是什么代码是应该做的:的number值应被追加到无论是在价值。也许像这样:test1或完全用数字替换该值。

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

+2

正则表达式匹配一个文字'{#}'。如果你的'value'是'test {#}','{#}'将被替换为数字。请参阅[本演示](https://ideone.com/Zizftn)。 E \只是停止引用,如果缺失,整个模式将被引用,就是这样。 –

+0

AFAIK'#'在正则表达式中没有特殊字符,所以假设Java正则表达式理解'\ Q',它将查找不存在于'value'中的字符串'{#}'。除此之外,你的猜测是错误的:'replaceAll'用'number'取代匹配 - 如果你想在最后附加一些东西,你需要匹配输入的结尾,例如只需使用表达式'$'。 – Thomas

+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正则表达式引擎是不是足够 “智能” 来澄清对大括号(PCRE,JS,.NET抛出一个java.util.regex.PatternSyntaxException: Illegal repetition错误可以很容易猜到,因为里面没有数字,所以它不是一个限制/限定量词)。