2012-01-19 179 views
0

我很困惑我的匹配器的find()方法返回比我認爲我的正則表達式會創建更多的匹配。下面是我寫的JUnit測試,試圖將其散列出來。所有的測試都通過了,但我不明白爲什麼我的find()返回匹配的組(1)值爲null或空(請參閱//爲什麼更多find()比實際匹配?matcher.find()匹配太多

public class JustTheDigits { 
    @Test 
    public void testJustTheDigits() { 
     doTest("DV_APLCN: 563 ,DV_DHR_APLCN: 5632, PIC_NOTE: 6254", new ArrayList<Integer>(Arrays.asList(563, 5632, 6254))); 
     doTest("563 ,DV_DHR_APLCN: 5632, PIC_NOTE", new ArrayList<Integer>(Arrays.asList(563, 5632))); 
     doTest("hello 563 jello", new ArrayList<Integer>(Arrays.asList(563))); 
     doTest("Hello World", new ArrayList<Integer>()); 
    } 

    private void doTest(String candidate, List<Integer> expected) { 
     List<Integer> actual = justTheDigits(candidate); 
     assertEquals(expected, actual); 
    } 

    private static Pattern pattern = Pattern.compile("(\\d+)?"); 

    public List<Integer> justTheDigits(String input) { 
     List<Integer> listOfDigits = new ArrayList<Integer>(); 
     Matcher matcher = pattern.matcher(input); 
     while (matcher.find()) { 
      String s = matcher.group(1); 
      // Why more find()s than actual matches? 
      if (s != null && "".equals(s) == false) { 
       listOfDigits.add(Integer.parseInt(s)); 
      } 
     } 
     return listOfDigits; 
    } 
} 

什麼,如果有的話,我可以做我的正則表達式,以避免流血不爲空或空管檢查?

回答

2

刪除?,以便您的正則表達式僅僅是(\\d+),因爲當一個或多個數字有一系列一個或多個數字時,正則表達式匹配。即使沒有數字,正則表達式仍然會匹配。

+0

唉,geez。這很容易。我喜歡RegEx。我與RegEx爭鬥。謝謝。 – 2012-01-19 01:34:27

+0

不用擔心,它花了我幾年時間才弄明白! – 2012-01-19 01:39:01

1

The?問號表示以前的聲明是可選的。從字面上看,你要求至少有一位數字是0或1。

更改模式爲"\\d+"它應該工作正常。

+0

我仍然需要分組,但刪除?完成它。 – 2012-01-19 01:31:12