Java 如何查找和删除不区分大小写匹配的字符串?
在Java中,我有一个文件包含如下行:Java 如何查找和删除不区分大小写匹配的字符串?,java,Java,在Java中,我有一个文件包含如下行: abc cbd CFG ... 如果任何一行与字符串匹配,我想从文件中删除CFG,该字符串可以是'CFG','CFG',或其他不区分大小写的变体 如果我将文件读入一个集合,我如何实现这一点?通过将文件读入列表来实现这一点似乎更为可行。类似这样的事情 try (BufferedReader bf = new BufferedReader(new FileReader(new File("PATH TO FILE"))); BufferedWrit
abc
cbd
CFG
...
如果任何一行与字符串匹配,我想从文件中删除CFG,该字符串可以是'CFG','CFG',或其他不区分大小写的变体
如果我将文件读入一个集合,我如何实现这一点?通过将文件读入列表来实现这一点似乎更为可行。类似这样的事情
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();
}
});
}
唯一糟糕的是需要两次尝试,因为不允许从lambdas抛出异常。以下是所需代码的“lambda版本”。感谢关于重新引发任何被抑制的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");
}
}
您可以在列表中搜索字符串,并使用位置删除该字符串
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;
}
public List removieteminListIgnoreCase(列表项、字符串项删除){
if(收款项为空(项目))
返回新的ArrayList();
对于(int i=0;iYou可以执行类似大写的操作,将字符串插入到集合中。string.equalsIgnoreCase(string str)
然后当您打印出来时,您丢失了所有原始大小写,这不是我需要的。APrintWriter
为您抑制异常。请参阅我的答案。BufferedReader#lines()
从行流中删除换行符。您需要使用bw.write(line.newline();
.Whoops!bw.write(line);bw.newline()将其添加回
你不能链接BufferedWriter
方法。很好!我不知道!@Sam-Ya,handy那PrintWriter
。现在如果他们只有.collect(toFile(path))
收集器,这可能是一个“一行程序”!虽然我刚刚读了更多关于它的内容,但它确实会吞噬异常。我想如果它抛出一个RuntimeException供生产使用,我会更高兴,所以如果它有点错误,我至少会在日志中结束一些东西。@Sam-你可以调用if(pw.checkError()){throw new IOException(“流有错误”);}
在try{}
块的末尾。也许没有那么多信息,但实际上你只关心出现了问题,以及问题大部分发生在哪里。是的,我意识到这将是一种折衷:)
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;
}