我试图在.csv文件的一行中找到一个正则表达式,所以我最终可以将所有匹配保存到另一个文件,并丢失所有其他垃圾。
因此我文件中的一行可能如下所示: 计算机名,用户,IP,VariableData,位置
我想要匹配VariableData,如果匹配,则打印该行。我正在使用一种模式,因为我只想要变量数据的10个中的3个,而在这3个中,它们的编号不同(例如,“pc104,pccrt102,pccart65”)。
我正在尝试使用扫描仪类进行此操作,并尽可能保持简单,以便我能理解它。这就是我在这个方向前进的地方......(模式不完整,只需要这样测试)。
import java.io.File;
import java.util.Scanner;
import java.util.regex.Pattern;
public class pcv {
public static void main(String[] args) {
File myFile = new File("c:\\temp\\report.csv");
Pattern myPat = Pattern.compile("pc");
try{
Scanner myScan = new Scanner(myFile);
while(myScan.hasNext()){
if(myScan.hasNext(myPat)){
System.out.println("Test");
}
}
}catch(Exception e){
}
}
}
这段代码循环,我猜测.hasNext()方法正在重置自己。我已经玩了一些Matcher类,但只找到了匹配表达式的方法,但没有得到整行。
我可能以某种方式计算包含模式的行,然后返回并打印与计数对应的行。
答案 0 :(得分:2)
这是grep
的设计目的,但是如果你想用Java做,那么你可以使用这个while
循环体:
while(myScan.hasNext()){
String line = myScan.nextLine();
if (myPat.matcher(line).find()) {
System.out.println(line);
}
}
正如其他人所提到的,原始代码的问题在于它实际上没有推进Scanner
。
答案 1 :(得分:1)
目前您只是询问扫描仪是否有其他条目,并且实际上没有(通过next()
)
答案 2 :(得分:1)
首先猜测你为什么要永远循环,因为Scanner类有两种方法:hasNext
和next
。
hasNext
将测试是否有另一个匹配的令牌,而不会移动文件中的Scanner
位置。
next
将返回下一个标记,如果由于某种原因不起作用,则抛出异常。
通常情况下,你会看到两个这样使用:
String token = "";
if(myScan.hasNext(wtv)) {
token = myScan.next(wtv);
}