我正在一段代码中进行模式匹配,该代码在一种情况下运行良好,但在另一种情况下则不然。目前的代码是:
DLVRYrx = Pattern.compile("(\\d+\\s\\p{Letter}+\\s\\d+)\\s(\\d+(?:\\.\\d+)?)\\s(\\d+)");
Log.d(TAG, "* Regex matched " + DLVRYrx.matcher("01 Jan 01 60.9876 1234").groupCount() + " groups"); // prints 3 as expected in logcat
for (int i=19; i<(fields-6); i++) {
final String DATAstr = values[i];
try {
Matcher Dmatch = DLVRYrx.matcher(DATAstr);
String data1 = Dmatch.group(0);
} catch (IllegalStateException e) {
Log.e(TAG, "! Text ["+DATAstr+"] didn't match regex");
}
}
该代码在 Dmatch.group(0) 行上抛出 IllegalStateException。 catch 中的 logcat 行的输出是“01 Jan 01 60.9876 1234”,如上所述。
对我正在读取的数据文件进行十六进制转储显示空格是预期的空格,并且在我匹配的文本之前或之后没有杂散字符。关于调试这个有什么建议吗?
我做了一些代码更改只是为了测试我的表达式本身,现在我更困惑了。在循环中,我现在首先检查字符串是否与模式匹配,然后通过编译的版本运行它:
Pattern P = Pattern.compile(DLVRYrxStr);
if(!DATAstr.matches(DLVRYrxStr)) {
Log.e(TAG, "[" + DATAstr + "] doesn't match regex");
break;
}
Matcher Dmatch = P.matcher(DATAstr);
不幸的是(?)模式确实匹配,因此落入 P.matcher 行,当我尝试读取第一个匹配组时,该行后面的行抛出异常:
W/System.err( 1238): java.lang.IllegalStateException: No successful match so far
W/System.err( 1238): at java.util.regex.Matcher.ensureMatch(Matcher.java:607)
W/System.err( 1238): at java.util.regex.Matcher.group(Matcher.java:358)
解决方案是添加“.matches()”检查,如下所示:
Matcher Dmatch = DLVRYrx.matcher(DATAstr);
Dmatch.matches();
String data1 = Dmatch.group(0);
是的,我在代码中的“if”语句中使用它,但像上面那样将其自由悬挂即可正常工作。