2012-03-27 80 views
1

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

+0

http://myregexp.com/signedJar.html在構建正則表達式,可以突出顯示用戶組,複製/複製到Java語法等等時非常有用 – zapl 2012-03-27 16:49:51

+0

如前所述,正則表達式適用於代碼中明確給出的示例字符串。它只對從文件解析的(相同)字符串不起作用。另外,我使用Brosinski的Eclispe的正則表達式測試器。 – mikebabcock 2012-03-27 16:51:36

+0

更新Android SDK(其中一個版本似乎),以防萬一。 – mikebabcock 2012-03-27 17:21:43

回答

4

您的DLVRYrx.matcher(...).groupCount()只是告訴你,在它創建的模式中有3個匹配的組。

(\\d+\\s\\p{Letter}+\\s\\d+)(\\d+(?:\\.\\d+)(\\d+)

你需要調用

matcher.matches()

matcher.lookingAt()

matcher.find()

試圖獲得之前,因爲這些方法會提示java解析字符串。

+0

看到我上面編輯的版本;比賽的作品。 p {L}和p {Letter}是等效的,用於「Unicode中的任何字母」。他們也與「火柴」合作。 – mikebabcock 2012-03-27 17:11:27

+0

測試也用'w'代替所有'p {Letter}'...同樣的錯誤。 – mikebabcock 2012-03-27 17:17:31

+0

@mikebabcock對不起,我以前沒有看到過 - 看到更新 - 另外,在創建你的'Matcher'之後,在你可以獲得'matcher.group(0)'之前,你需要運行'matcher.matches()' 。試試看。 – Shaded 2012-03-27 17:39:42