2012-09-28 58 views
1

我有串:模式matcher.group()越界异常

String myString1 = "22223 2342 1 98 333 3 665" 

    String myString2 = "22323 3 222 34 33 1 98" 

我只想提取有1位,那么空间的价值,那么只有两个数字。

private static final Pattern p3DigitsGap = Pattern.compile(".*\\b\\d\\s\\d{2}\\b.*"); 

在上述两个串,我想找提取“1 98”我不能只用空白任一侧分割的情况下,该图案是在所述字符串的末尾。

 Matcher matcher = p3DigitsGap.matcher(myString1); 
     if (matcher.find()) { 
      Log.i("Matcher found"); 
      while (matcher.find() == true) { 
       Log.i("Matcher is true"); 
       String extract = matcher.group(1); 
       Log.d("extract: " + extract); 
      } 
     } 

如果我删除while循环,则字符串提取不会填充并引发超出边界异常。我在while循环中添加了并且matcher.find()不等于true。

我想换我的模式:

Pattern p3DigitsGap = Pattern.compile("[^0-9a-z]\\d\\s\\d{2}[^0-9a-z]"); 

我认为使用* \\ B的可能会造成问题,但我得到了相同的结果。

请有人帮助我了解我哪里出错了。

在此先感谢。

回答编辑:我标记了Reimeus的正确答案,因为它通过使用上述正则表达式的组来工作。另请参阅Tim Pietzcker提供的替代解决方案,以改进我的原始正则表达式。

回答

2

更好的匹配时使用groups,所以你可以使用:

Pattern p3DigitsGap = Pattern.compile(".*\\b(\\d\\s\\d{2})\\b.*"); 
Matcher matcher = p3DigitsGap.matcher(myString1); 
if (matcher.find()) { 
    Log.i("Matcher is true"); 
    String extract = matcher.group(1); 
    Log.d("extract: " + extract); 
} 
+0

非常感谢!如果我稍微调整你的答案,使得括号包围(\\ d \\ s \\ d {2}),我会得到正确的输出“1 98”。是对的吗? – brandall

+0

是的,你是对的,我的不好,忘记了这个空间和2位数,已经更新了正确的答案 – Reimeus

+0

@andjav在你的输入是''1 98 333 3 665''或'22223 2342 1 98 “',看我的答案! – turtledove

1

两个问题:

  • 你不必在你的正则表达式的任何捕获组,因此任何比赛的最高有效的组会.group(0)(整场比赛)。

  • 您的示例字符串只匹配一次,但您拨打matcher.find()两次,因此第二个呼叫(在while循环中)不会返回任何匹配。

试试这个:

Pattern p3DigitsGap = Pattern.compile("\\b\\d\\s\\d{2}\\b"); 
Matcher matcher = p3DigitsGap.matcher(myString1); 
if (matcher.find()) { 
    Log.i("Matcher found"); 
    String extract = matcher.group(0); 
    Log.d("extract: " + extract); 
} 
+0

谢谢,但matcher.group(0)返回myString1的全部内容? – brandall

+0

@andjav:对,你需要从你的第一个正则表达式中删除'。*'。 –

+0

你为什么这么建议?它在潜在的String匹配的开始和结束时都可以正常工作。 – brandall

1

你没有定义的组,您可以定义使用(and)一组,我认为你的代码应该是:

private static final Pattern p3DigitsGap = Pattern.compile("\\b\\d\\s\\d{2}\\b"); 
Matcher matcher = p3DigitsGap.matcher(myString1); 
while (matcher.find()) { 
    Log.i("Matcher is true"); 
    String extract = matcher.group(0); 
    Log.d("extract: " + extract); 
} 
+0

matcher.group(0)返回myString1的全部内容? – brandall

+0

@andjav不,组(0)返回整个匹配的字符串。我刚刚发现你的正则表达式是错误的,我改变了我的答案,试试! – turtledove

+0

不(?= <\\ s)表示空格吗?我认为赖梅斯可能会在上面提供的解决方案中(括号内)围绕我想要提取到组(1)的区域。也许这就是你的意思(和)。感谢您的回答。 – brandall