2016-05-31 59 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錯誤可以很容易猜到,因爲裏面沒有數字,所以它不是一個限制/限定量詞)。