2010-03-20 55 views
2

我想在一个.csv文件的行中找到正则表达式,所以我最终可以保存所有匹配到另一个文件,并失去所有其他垃圾。打印一个字符串,其中包含一个特定的模式在Java

所以在我的文件中的行可能看起来像: 计算机名,用户,IP,VariableData,位置

的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

我知道它的语义,但不会_match_模式,不_contain_它? – 2010-03-20 14:58:01

回答

2

这东西grep是专为,但如果你想这样做在Java中,那么你可以使用这个while循环体而不是:

while(myScan.hasNext()){ 
    String line = myScan.nextLine(); 
    if (myPat.matcher(line).find()) { 
     System.out.println(line); 
    } 
} 

正如其他人所说,你的原代码的问题是,它实际上并没有提前Scanner

+0

现在这一切都变得更有意义。感谢所有的帮助。 – jjpotter 2010-03-21 13:10:41

1

在你只要求扫描仪,如果有另一个入口的那一刻,和没有真正得到它(通过next()

1

首先猜测,为什么你永远循环是扫描仪类有两种方法:hasNextnext

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

next将返回下一个标记,并在出于某种原因不起作用时抛出异常。

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

String token = ""; 
if(myScan.hasNext(wtv)) { 
    token = myScan.next(wtv); 
} 
相关问题