2012-07-26 182 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