2012-09-28 87 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