我希望以下代码可以找到所有可用模式的标记。我解析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)
和异常时检查它是否有更多匹配?
答案 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
}