2010-11-05 184 views
2

我以前在Java中使用过string.replaceAll(),但没有遇到任何麻烦,但是我很困惑这一点。我认为这只是工作,因为没有“/”或“$”字符。这是我想要做的:这个Java String.replaceAll()代码为什么不起作用?

String testString = "__constant float* windowArray"; 
String result = testString.replaceAll("__constant float* windowArray", "__global float* windowArray"); 

变量结果看起来和testString一样。我不明白为什么没有改变,请帮助。

+0

哇。我越学习Java,就越喜欢C#。 – Crispy 2010-11-05 21:07:26

+0

可能的[String.replaceAll反斜杠问题]的副本(http://stackoverflow.com/questions/1701839/backslash-problem-with-string-replaceall) – McDowell 2011-05-26 08:32:57

回答

7

传递的replaceAll的第一个参数仍被视为正则表达式。 *字符是一个特殊字符,意思是粗略地说,字符串中的前一个字符(这里是:t)可以存在0次或更多次。你想要做的是逃避*的正则表达式。你的第一个参数应该更像:

"__constant float\\* windowArray" 

第二个参数是,你的目的,至少,还只是一个普通的字符串,所以你不需要逃避*那里。

String result = testString.replaceAll("__constant float\\* windowArray", "__global float* windowArray"); 
2

您需要转义*,因为它是正则表达式中的特殊字符。

所以testString.replaceAll("__constant float\\* windowArray", "__global float\\* windowArray");

+0

或者,如果手动转义不可行(例如,在构建模式时在运行时),使用'Pattern.quote(String)'和'Matcher.quoteReplacement(String)'。 – Barend 2010-11-05 20:54:49

0
String result = testString.replaceAll("__constant float windowArray\\\\*", "__global float\\* windowArray"); 
2

*是一个正则表达式量词。 replaceAll方法使用正则表达式。为避免使用正则表达式,请尝试使用替代方法。

实施例:

String testString = "__constant float* windowArray"; 
String replaceString = "__global float* windowArray"; 
String result = testString.replace(testString.subSequence(0, testString.length()-1), 
      replaceString.subSequence(0, replaceString.length()-1)); 
相关问题