Java中的调试模式(正则表达式)失败(Android)
我在一段代码中进行模式匹配,在一种情况下可以正常工作,但在另一种情况下工作正常。代码当前是:Java中的调试模式(正则表达式)失败(Android)
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。如上所述,捕获的logcat行的输出是“01 Jan 01 60.9876 1234”。
对正在阅读的数据文件执行hexdump显示空格符合预期,并且在匹配的文本之前或之后没有任何杂散字符。任何关于调试的建议?
为了测试我自己的表达,我做了一些代码更改,现在我更加困惑。在循环中,我现在检查是否字符串模式首先匹配,然后通过编译版本运行它:
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'语句,但是如上所述,可以*悬挂。
您的DLVRYrx.matcher(...).groupCount()
只是告诉你,在它创建的模式中有3个匹配的组。
即 (\\d+\\s\\p{Letter}+\\s\\d+)
, (\\d+(?:\\.\\d+)
和 (\\d+)
你需要调用
matcher.matches()
matcher.lookingAt()
或
matcher.find()
试图获得之前,因为这些方法会提示java解析字符串。
看到我上面编辑的版本;比赛的作品。 p {L}和p {Letter}是等效的,用于“Unicode中的任何字母”。他们也与“火柴”合作。 – mikebabcock 2012-03-27 17:11:27
测试也用'w'代替所有'p {Letter}'...同样的错误。 – mikebabcock 2012-03-27 17:17:31
@mikebabcock对不起,我以前没有看到过 - 看到更新 - 另外,在创建你的'Matcher'之后,在你可以获得'matcher.group(0)'之前,你需要运行'matcher.matches()' 。试试看。 – Shaded 2012-03-27 17:39:42
http://myregexp.com/signedJar.html在构建正则表达式,可以突出显示用户组,复制/复制到Java语法等等时非常有用 – zapl 2012-03-27 16:49:51
如前所述,正则表达式适用于代码中明确给出的示例字符串。它只对从文件解析的(相同)字符串不起作用。另外,我使用Brosinski的Eclispe的正则表达式测试器。 – mikebabcock 2012-03-27 16:51:36
更新Android SDK(其中一个版本似乎),以防万一。 – mikebabcock 2012-03-27 17:21:43