Java регулярное выражение совпадает только если проверено соответствие - PullRequest
1 голос
/ 12 августа 2011

Внутри класса у меня есть шаблон private Pattern lossWer = Pattern.compile("^\\d+ \\d+ (\\d+).*").Одна из функций выглядит следующим образом:

public double[] getWer(){
    double[] wer = new double[someStrings.size()];
    Matcher m;
    for(int i = 0; i < wer.length; i++){
        m = lossWer.matcher(someStrings.get(i));
        wer[i] = Double.parseDouble(m.group(1));
    }
    return wer;
}

Вызов этого не удастся с java.lang.IllegalStateException: No match found.Когда я изменяю это на это, оно работает:

public double[] getWer(){
    double[] wer = new double[someStrings.size()];
    Matcher m;
    for(int i = 0; i < wer.length; i++){
        m = lossWer.matcher(someStrings.get(i));
        if(!m.matches())
            ;
        wer[i] = Double.parseDouble(m.group(1));
    }
    return wer;
}

Конечно, мое приложение не просто использует пустую точку с запятой для этой строки, но я иллюстрирую, что строка здесь ничего не делаетно позволяет программе работать без ошибок.Почему строки совпадают без ошибок во втором примере, а не в первом?

Ответы [ 3 ]

4 голосов
/ 12 августа 2011

Вы не можете использовать group () без предварительного вызова find () или совпадений () . Вот как работают регулярные выражения. Сначала вы создаете шаблон, затем сопоставитель, а затем либо находите () экземпляры регулярного выражения, либо проверяете, соответствует ли он ().

3 голосов
/ 12 августа 2011

Проверьте это для IllegalStateException

Явное состояние сопоставителя изначально не определено;попытка запросить любую его часть до успешного совпадения вызовет исключение IllegalStateException.Явное состояние сопоставления пересчитывается каждой операцией сопоставления.

Это в сочетании с ответом Райана должно дать вам то, что вам нужно.

1 голос
/ 12 августа 2011

Пока вы не позвоните m.matches(), вы не проверяли регулярное выражение, поэтому нет групп.

Вы говорите в этой строке, протестируйте регулярное выражение. Если нет совпадений, ничего не делайте, затем вы продолжаете проверять группу (1) совпадения (и поскольку совпадение с группой было выполнено).

Было бы лучше изменить:

    if(!m.matches())
        ;
    wer[i] = Double.parseDouble(m.group(1));

Кому:

    if(m.matches())
        wer[i] = Double.parseDouble(m.group(1));

Или используйте !m.matches(), чтобы вернуть ошибку или что-то в этом роде. Ваш выбор:)

...