0

正規表現が作成すると思っていたよりも多くの一致を返すMatcherのfind()メソッドに混乱しています。以下は、これをハッシュ化するために作成したJUnitテストです。すべてのテストに合格しましたが、find()がgroup(1)値がnullまたは空の一致を返す理由がわかりません(//実際の一致よりも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;
    }
}

血まみれのヌルではないチェックや空のチェックを回避するために、正規表現に対して何ができますか?

4

3 に答える 3

2

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

于 2012-01-19T01:07:09.973 に答える
1

?疑問符は、前のステートメントがオプションであることを示しています。文字通り、あなたは任意の数字の少なくとも1つの0または1を求めています。

パターンをに変更する"\\d+"と、正常に機能するはずです。

于 2012-01-19T01:07:26.430 に答える
1

これを読んでください:http://docs.oracle.com/javase/tutorial/essential/regex/quant.html

1桁以上のグループを一度表示するか、まったく表示しないようにする必要があるとおっしゃっていると思います。そのため、見つからない場合でも一致が返されます。何をしたいのかよくわかりませんが、「\d+」で大丈夫だと思います

于 2012-01-19T01:16:10.560 に答える