2012-01-19 12 views
0

私の正規表現のfind()メソッドは、私の正規表現が作成すると思われるよりも多くのマッチを返すと混乱します。以下は、これをハッシュしようとしたJUnitテストです。すべてのテストは合格しますが、なぜ私のfind()戻り値がgroup(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

?を削除して、1つ以上の数字が連続している場合に正規表現が一致するように、正規表現が単純に(\\d+)になるようにします。数字がない場合でも、正規表現は引き続き一致します。

+0

Aw、geez。それは簡単です。私はRegExが大好きです。私はRegExと闘う。ありがとう。 –

+0

心配しなくても、それを理解するのに数年かかりました! –

1

?疑問符は、前のステートメントはオプションであると言います。文字通り言葉では、少なくとも1桁の0または1を求めています。

パターンを"\\d+"に変更しても問題ありません。

+0

私はまだグループ化が必要ですが、それを削除しますか?それが完了します。 –

1

この読み:私はあなたが任意の1桁以上のグループはすべて一度かどうかを表示したいと言っていると信じてhttp://docs.oracle.com/javase/tutorial/essential/regex/quant.html

を。そのため、それが見つからなければそれでも一致が返されます。私はあなたがしたいことを正確には分かっていませんが、おそらく "\ d +"とうまくいくと思います。

関連する問題