在Java中打印包含特定模式的字符串

时间:2010-03-20 14:54:31

标签: java string fileparsing

我试图在.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类,但只找到了匹配表达式的方法,但没有得到整行。

我可能以某种方式计算包含模式的行,然后返回并打印与计数对应的行。

3 个答案:

答案 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类有两种方法:hasNextnext

hasNext将测试是否有另一个匹配的令牌,而不会移动文件中的Scanner位置。

next将返回下一个标记,如果由于某种原因不起作用,则抛出异常。

通常情况下,你会看到两个这样使用:

String token = "";
if(myScan.hasNext(wtv)) {
    token = myScan.next(wtv);
}