我在一段代碼中進行模式匹配,在一種情況下可以正常工作,但在另一種情況下工作正常。代碼當前是: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'語句,但是如上所述,可以自由懸掛。
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