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'语句,但是如上所述,可以*悬挂。

+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

您的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