0

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

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

..很快

只要搜索字符串位于文件中每一行的开头,此逻辑就有效。否则不会发生模式匹配。任何人都可以提出解决方案吗?

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

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

4

4 回答 4

1

不应该是……吗?

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

考虑到限定符可能会影响结果,也许搜索字符串应该是“(this)+”或“(this)+?”。

于 2012-05-09T10:40:23.410 回答
0

我不熟悉 Java,但根据文档,lookingAt查看字符串的开头。我会跳过去寻找比赛,replaceAll不管有没有比赛,我都会盲目奔跑;如果没有匹配,它将不会替换任何内容。

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

于 2012-05-09T10:47:26.837 回答
0

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

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

使用String.indexOf和/或String.replace代替。

while ((line = readLine()) != null)
    if (line.indexOf(searchString) != -1 )
        line.replace(searchString, replaceString);
于 2012-05-09T10:31:14.980 回答
0

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

于 2012-05-09T11:32:42.120 回答