使用JAVA REGEX搜索任何给定的字符串

时间:2012-05-09 10:29:00

标签: java regex pattern-matching matcher

我正在尝试编写一个通用方法,该方法将在文件中搜索给定字符串并将其替换为另一个字符串。我正在使用java正则表达式

patternMatcher = Pattern.compile(searchString);
while ((line = readLine()) != null) {
    Matcher regexMatcher = patternMatcher.matcher(line);
       if (regexMatcher.lookingAt()) {
          line = regexMatcher.replaceAll(replaceString); 

..等等

只要搜索字符串位于文件中每行的开头,此逻辑就可以正常工作。否则不会发生模式匹配。有人可以建议一个解决方案吗?

例如。我的搜索字符串是“This”,Replace字符串是“That” 输入文件包含:This is not This funny
输出:That is not That funny

但是当时 输入文件包含:007 This is not This funny
输出:007 This is not This funny

4 个答案:

答案 0 :(得分:1)

不应该......?

patternMatcher = Pattern.compile(searchString);
while ((line = readLine()) != null) {
    Matcher regexMatcher = patternMatcher.matcher(line);
       while (regexMatcher.find()) {
          line = regexMatcher.replaceAll(replaceString); 

考虑到quatifier可能会影响结果,perhapaps搜索字符串应为“(this)+”或“(this)+?”。

答案 1 :(得分:0)

如果您正在搜索常量字符串而不是模式,那么您应该使用正则表达式的原因有很多:

  • 用户可能会输入一些在正则表达式语法中具有特殊含义的字符。
  • 与子字符串搜索相比,正则表达式很慢。
  • 您不希望允许用户使用比您想要的更多功能(使用正则表达式匹配)。

改为使用String.indexOf和/或String.replace

while ((line = readLine()) != null)
    if (line.indexOf(searchString) != -1 )
        line.replace(searchString, replaceString);

答案 2 :(得分:0)

我不熟悉Java,但根据文档,lookingAt查看字符串的开头。我会跳过寻找比赛并盲目地运行replaceAll,无论是否匹配;如果没有匹配,它将不会取代任何内容。

如果由于某种原因你需要在尝试替换之前寻找匹配(这很浪费),正确的函数是find。见http://docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/Matcher.html

答案 3 :(得分:0)

如果内存不是问题,您可以将整个文件读作String并在String API中使用public String replaceAll(String regex, String replacement)