Java扫描程序搜索相同的模式两次

时间:2013-10-06 18:59:49

标签: java java.util.scanner

我希望以下代码可以找到所有可用模式的标记。我解析shell命令iwlist wlp3s0 scanning,因此总是有多个访问点(重复模式)。我需要以某种方式解析它们。

    Scanner s = new Scanner(commandOutput);
    String pattern = ".*?Address: (\\S*) .*?Channel:(\\d*) .*?Frequency:(\\S*) .*?Quality=(\\d*)/(\\d*) .*?Signal level=-(\\d*)";
    //s.findInLine(pattern);
    while(true){
        s.findInLine(pattern);    
        MatchResult result = s.match();
        for (int i = 1; i <= result.groupCount(); i++) {
            System.out.println(result.group(i));
        }
    }

但它抛出了这个例外:java.lang.IllegalStateException

如何在循环而不是while(true)和异常时检查它是否有更多匹配?

1 个答案:

答案 0 :(得分:1)

问题在于match()方法:

  

公开MatchResult匹配()

     

返回此扫描仪执行的上次扫描操作的匹配结果。如果未执行匹配,或最后一次匹配不成功,此方法将抛出IllegalStateException。

但为什么这是一个问题呢?执行了一场比赛,所以只能是没有成功。让我们看一下findInLine的文档(实际信息来自variant accepting a Pattern argument):

  

public String findInLine(Pattern pattern)

     

尝试查找忽略分隔符的指定模式的下一个匹配项。 如果在下一行分隔符之前找到模式,则扫描程序将超过匹配的输入,并返回与该模式匹配的字符串。如果在此处未检测到此类模式输入到下一行分隔符,然后返回null并且扫描仪的位置不变。此方法可能会阻止等待与模式匹配的输入。

     

由于此方法继续搜索输入以查找指定的模式,因此如果不存在行分隔符,它可以缓冲搜索所需标记的所有输入。

那么这是什么呢?它匹配模式,并将“标记”放在匹配的字符串的末尾。但是这并不包含实际行中的所有内容,因此下一个findInLine调用将尝试匹配剩余的内容(换行符等) - 并且将无法执行此操作...

扫描程序必须通过发出nextLine()调用并且不使用返回的字符串来消耗所有内容,直到行结束:

Scanner s = new Scanner(commandOutput);
String pattern = ".*?Address: (\\S*) .*?Channel:(\\d*) .*?Frequency:(\\S*) .*?Quality=(\\d*)/(\\d*) .*?Signal level=-(\\d*)";

//instead of "true, use hasNextLine()"
while(s.hasNextLine()){
    s.findInLine(pattern);    
    MatchResult result = s.match();
    for (int i = 1; i <= result.groupCount(); i++) {
        System.out.println(result.group(i));
    }
    s.nextLine(); // consume everything  from this line
}