【问题标题】:.contains() not finding multiple lines in java.contains() 在java中找不到多行
【发布时间】:2021-07-07 12:10:36
【问题描述】:

我正在尝试为文本上的特定行执行字符串 .contains() 我正在使用 Files.readAlllines 读取文件的行。 我正在尝试做

Path c1=Paths.get(prop.getProperty("testPWP"));
     List<String> newLines1 = new ArrayList<String>();
     for (String line : Files.readAllLines(c1, StandardCharsets.UTF_8)) {
if (line.contains("return test ;\r\n" + "       }")) {
    newLines1.add( line.replace("return test ;\r\n" +
            "       }", "return test ;\r\n" +
            "       }*/"));
}


         else {
                newLines1.add(line);
             }
         }
         Files.write(c1, newLines1, StandardCharsets.UTF_8);

我基本上试图在 return 语句之后注释 } 但包含函数没有将其重新识别为文件中的新行。 对这个问题有帮助吗?

【问题讨论】:

  • Files.readAllLines() 按行分隔符拆分输入(即两行文本作为两个字符串返回)。您的搜索模式包含行终止符,因此永远无法找到 - 您必须在两个不同的字符串中搜索第一部分和第二部分。
  • @ThomasKläger 但我无法单独搜索,因为文件中有其他 } 这就是为什么我将整个字符串作为
  • 你能用我上面的代码显示任何建议来读取和修改然后写入同一个文件@ThomasKläger

标签: java string file contains


【解决方案1】:

您可以使用replaceable参数来替换正则表达式。

演示:

public class Main {
    public static void main(String[] args) {
        String find = "return test ;\r\n" + "       }";
        String str = "Hello return test ;\r\n" + "       } Hi Bye";
        boolean found = str.contains(find);
        System.out.println(found);
        if (found) {
            str = str.replaceAll("(" + find + ")", "/*$1*/");
        }
        System.out.println(str);
    }
}

输出:

true
Hello /*return test ;
       }*/ Hi Bye

这里$1指定capturing groupgroup(1)

在您的程序中,str 的值可以填充如下:

String str = Files.readString(path, StandardCharsets.US_ASCII);

如果你的 Java 版本低于 11,你可以这样做:

String str = new String(Files.readAllBytes(Paths.get(path)), StandardCharsets.US_ASCII);

【讨论】:

  • 这在我的情况下不起作用,因为我使用 Files.readAllLines 读取文件然后检查字符串
  • @dave - 我添加了一个更新,您可以使用它将文件内容读入str
  • @Arvind Kumar Avinash 我不需要遍历这个字符串吗?还如何对使用这种新方法读入的同一文件执行写入操作?
  • @dave - 这取决于您的要求。如果要逐行处理内容,则需要迭代;否则,您不需要这样做。 关于迭代的注意事项:如果你知道Stream API,你会更容易处理每一行,例如Files.readAllLines(Paths.get(path), encoding).stream().map(...)...
  • 看看我的问题,我编辑了它这是我的迭代问题,这是我可以为 Q 中提到的 2 行执行 .contains(),如何更改它以读取新方法?
【解决方案2】:

您可能已经注意到,Files.readAllLines 读取所有行并返回一个列表,其中每个字符串代表一行。要完成您要执行的操作,您需要将整个文件读入单个字符串,或者连接已有的字符串,或者更改替换方法。最简单的方法是将文件的全部内容读入一个字符串,可以如下完成:

String content = new String(Files.readAllBytes(Paths.get("path to file")));

或者如果您使用的是 Java 11 或更高版本:

String content = Files.readString(Paths.get("path to file"));

【讨论】:

  • 我想写入文件以及修改后,如果可以的话,你可以展示一个演示
猜你喜欢
  • 2015-05-04
  • 2014-04-25
  • 2021-05-12
  • 2022-01-23
  • 2015-07-20
  • 2011-05-28
  • 2021-04-03
  • 1970-01-01
  • 2013-11-22
相关资源
最近更新 更多