2012-07-26 74 views
2

我的Java應用程序正試圖從一個文件中,修改下面一行:Java的正則表達式替換精確匹配

static int a = 5; 

我們的目標是「A」與「mod_a」來代替。

使用簡單string.replace(var_name, "mod" + var_name)給了我下面的:

stmod_atic int mod_a = 5; 

這是相當完全錯誤的。谷歌搜索我發現,你可以預先安排「\ B」,然後var_name必須代表一個字的開頭,但是,string.replace("\\b" + var_name, "mod" + var_name)絕對沒有:(

(我也用「\ b」而不是「\ b 「)

回答

9
  • \b這裏是一個regular expression意味着一個單詞邊界,所以它幾乎是你想要的。
  • String.replace()使用正則表達式(所以\b將只匹配字面\b)。
  • String.replaceAll()確實使用正則表達式
  • 您還可以使用\b之前和你的變量之後,爲了避免與「mod_aDifferentVariable」代替「aDifferentVariable」。

因此,一個可能的解決辦法是這樣的:

String result = "static int a = 5;".replaceAll("\\ba\\b", "mod_a"); 

或更一般:

static String prependToWord(String input, String word, String prefix) { 
    return input.replaceAll("\\b" + Pattern.quote(word) + "\\b", Matcher.quoteReplacement(prefix + word)); 
} 

請注意,我在的情況下word使用Pattern.qoute()包含在常規有含義的任何字符表達式。由於類似的原因Matcher.quoteReplacement()用於替換字符串。

+1

我很樂意給你的建議Pattern.quote另投,可惜我不能:( – 2012-07-26 10:54:12

+1

記住,正則表達式是不完美的一樣複雜的語義匹配編程語言,例如試圖用'mod_a'代替'a' @ Joachim的正則表達式也會影響標識符的註釋和其他實例。 a_mod {public a_mod(int a_mod){...'。Oops。 – LisMorski 2012-07-26 10:58:17

+0

@LisMorski:非常真實:正則表達式並不能代替真正的重構工具!但是,如果你直觀地掃描結果以達到理智;-) – 2012-07-26 11:01:43

4

嘗試:

string.replaceAll("\\b" + var_name + "\\b", "mod" + var_name); 
+1

它的工作。但是,由於更詳細的探討,我會接受紹爾的答案。不過,不要爲此獲得亞軍的一票! – 2012-07-26 10:51:11

+1

哈哈,別擔心!他也是第一個。 – Daniel 2012-07-26 10:52:45