matcher.find () слишком много соответствует - PullRequest
0 голосов
/ 19 января 2012

Меня смущает метод find () моего Matcher, который возвращает больше совпадений, чем я ожидал, что мое регулярное выражение создаст. Ниже приведен тест JUnit, который я написал, чтобы попытаться выяснить это. Все тесты пройдены, но я не понимаю, почему мой find () возвращает совпадения, чье значение group (1) равно нулю или пусто (см. // Почему больше find (), чем фактических совпадений? Commend в коде)?

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;
    }
}

Что, если что-нибудь, я могу сделать с моим регулярным выражением, чтобы избежать проверки кровавых, не нулевых или пустых?

Ответы [ 3 ]

2 голосов
/ 19 января 2012

Удалите ?, чтобы ваше регулярное выражение было просто (\\d+), поскольку ваше регулярное выражение совпадает, когда существует серия из одной или нескольких цифр, один или несколько раз. Даже если цифр нет, регулярное выражение все равно будет совпадать.

1 голос
/ 19 января 2012

читать это: http://docs.oracle.com/javase/tutorial/essential/regex/quant.html

Я полагаю, вы говорите, что хотите, чтобы группа из одной или нескольких цифр появлялась один раз или не появлялась вообще . поэтому, если он не найдет его, он все равно вернет совпадение. Я не уверен, что именно вы хотите сделать, но я думаю, что вы, вероятно, будете в порядке с "\ d +"

1 голос
/ 19 января 2012

? знак вопроса говорит, что предыдущее утверждение не является обязательным. В буквальном смысле слова вы запрашиваете 0 или 1 по крайней мере 1 из любой цифры.

Измените шаблон на "\\d+", и он должен работать нормально.

...