如何查找和删除不区分大小写匹配的字符串?

时间:2016-04-05 23:58:24

标签: java

在Java中,我有一个包含以下行的文件:

abc
cbd
CFG
...

如果任何行匹配字符串,我想从文件中删除CFG,这可能是'cfg','Cfg'或其他不区分大小写的变体。

如果我将文件读入Set,我该如何实现?通过将文件读入List中来执行此操作似乎更为可行。

4 个答案:

答案 0 :(得分:1)

这样的东西?

try (BufferedReader bf = new BufferedReader(new FileReader(new File("PATH TO FILE")));
     BufferedWriter bw = new bw(new FileWriter(new File("PATH TO NEW FILE")))) {
  bf.lines()
      .filter(line -> !line.equalsIgnoreCase("cfg"))
      .forEach(line -> {
        try {
          bw.write(line);
        } catch (IOException e) {
          e.printStackTrace();
        }
  });
}

唯一不可思议的是需要两个trys,因为不允许从lambda中抛出异常。

答案 1 :(得分:1)

以下是" lambda版本"所需的代码。感谢@Sam关于重新提升任何被抑制的PrintWriter IOException的重要观点。

Path in_file = Paths.get("infile");
Path out_file = Paths.get("outfile");
try (PrintWriter pw = new PrintWriter(out_file.toFile())) {
    Files.lines(in_file)
         .filter(line -> !line.equalsIgnoreCase("cfg"))
         .forEach(pw::println);
    if (pw.checkError()) {
        throw new IOException("Exception(s) occurred in PrintWriter");
    }
}

如果您需要修改文件,那么在阅读文件时写入文件会更困难一些。你可以先将它全部读入内存。

Path path = new Path("filename");
List<String> lines = Files.lines(path)
                          .filter(line -> !line.equalsIgnoreCase("cfg"))
                          .collect(Collectors.toList());

try(PrintWriter pw = new PrintWriter(path.toFile())) {
    lines.forEach(pw::println);
    if (pw.checkError()) {
        throw new IOException("Exception(s) occurred in PrintWriter");
    }
}

最后,为了以防万一,与lambda兼容的非lambda解决方案:

Path in_file = Paths.get("infile");
Path out_file = Paths.get("outfile");
try (BufferReader reader = Files.newBufferedReader(in_file);
         PrintWriter pw = new PrintWriter(out_file.toFile())) {

    String line;
    while((line = reader.readline()) != null) {
        if (!line.equalsIgnoreCase("cfg")) {
            pw.println(line);
        }
    }
    if (pw.checkError()) {
        throw new IOException("Exception(s) occurred in PrintWriter");
    }
}

答案 2 :(得分:0)

您可以在列表中搜索字符串,然后使用位置将其删除。

public List<String> removeItemInListIgnoreCase(List<String> items, String itemToRemove){
        if(CollectionUtils.isEmpty(items)) 
        return new ArrayList<String>();
        for(int i=0; i<items.size();i++) {
            if(items.get(i).equalsIgnoreCase(itemToRemove)) {
                items.remove(i);
            }
        }
        return items;
    }

答案 3 :(得分:-1)

我认为TreeSet正是您所寻找的,请看一下这个链接:

Java Set<String> equality ignore case