Java Matcher не работает для действительного шаблона pcre

Вот пример рабочего регулярного выражения: https://regex101.com/r/wO3yP2/2

Здесь я пытаюсь найти, нет ли недействительного или сбоя в xml.

Вот шаблон /^((?!INVALID|FAIL).)*$/i

Вот класс Java, пытающийся сделать то же самое, но не могу найти совпадение.

class RegexChecker {
    public static void main(String args[]){
        String success = "this version has success in it";
        String reject = "this failure version doesnot have the s word in it";
        String falsePositive = "this version is invalid but still has success in it";
        Pattern pattern = Pattern.compile("^((?!INVALID|FAIL).)*$", Pattern.CASE_INSENSITIVE);

        Matcher successMatcher = pattern.matcher(success);
        if(successMatcher.find()){
            System.out.println("Success Matches");
        }
        Matcher rejectMatcher = pattern.matcher(reject);
        if(rejectMatcher.find()){
            System.out.println("Reject Matches");
        }
        Matcher falsePosMatcher = pattern.matcher(falsePositive);
        if(falsePosMatcher.find()){
            System.out.println("PseudoSuccess Matches");
        }
    }
}

Чем средство проверки регулярных выражений Java отличается от PCRE?


person Dhwanit    schedule 01.05.2015    source источник
comment
Даже ваша демонстрация regex101 не находит совпадений.   -  person anubhava    schedule 01.05.2015
comment
Что касается диалектных различий, в Википедии есть хороший обзор (но ваша проблема не в этом).   -  person Amadan    schedule 01.05.2015
comment
Вот соответствие для строки, которая не содержит invalid или failure -- regex101.com/r/wO3yP2/3   -  person Dhwanit    schedule 01.05.2015
comment
Строка с сбоем не должна совпадать — в этой версии с ошибкой нет слова s.   -  person Dhwanit    schedule 01.05.2015
comment
Строка с invalid, за которой следует success, не должна совпадать — regex101.com/r/wO3yP2/5   -  person Dhwanit    schedule 01.05.2015
comment
@anubhava - посмотрите 3 ссылки выше. будет ясно   -  person Dhwanit    schedule 01.05.2015
comment
Я считаю, что вам нужно это регулярное выражение. Это будет вести себя одинаково в PCRE или в Java.   -  person anubhava    schedule 01.05.2015
comment
Почему бы вам не попробовать вместо этого обратить тест?   -  person fge    schedule 01.05.2015
comment
@anubhava - ваше регулярное выражение работает с regex101, но не в коде Java, когда я пытаюсь использовать его, как показано ниже. Pattern.compile("^(?!.*?\b(INVALID|FAIL)\b).*$", Pattern.CASE_INSENSITIVE) Оно соответствует строкам, содержащим недействительные и ошибочные.   -  person Dhwanit    schedule 01.05.2015
comment
@Amadan - я намерен проверить отсутствие Invalid или Fail где-либо во всей строке. Также, пожалуйста, посмотрите на ссылку примера, и вы увидите, что она работает. regex101.com/r/wO3yP2/3   -  person Dhwanit    schedule 01.05.2015
comment
Извините, пропустил звезду.   -  person Amadan    schedule 01.05.2015
comment
Попробовав несколько вещей и поняв, что происходит с версией Анубхавы, я понял, что мне не нужна граница слова, потому что строка представляет собой очень длинный xml. Этот шаблон делает то, что я намереваюсь достичь ^(?!.*?(INVALID|FAIL)).*$. Я читаю этот шаблон так: --› для любого символа смотреть вперед и терпеть неудачу, если есть недействительный или сбой, которому предшествует ноль или много символов. Однако это не имеет для меня смысла, потому что вот мой более ранний шаблон ^((?!INVALID|FAIL).)*$, который при чтении означает, что для каждого символа (включая пустую строку) происходит сбой, если INVALID или Fail найдены где-либо в строке   -  person Dhwanit    schedule 01.05.2015
comment
Я был бы очень признателен, если бы кто-нибудь мог пояснить, почему дополнительный .* в отрицательном разделе просмотра вперед будет иметь значение? для меня оба шаблона похожи   -  person Dhwanit    schedule 01.05.2015


Ответы (2)


    String success = "this version has success in it";
    String reject = "this failure version doesnot have the s word in it";
    String falsePositive = "this version is invalid but still has success in it";
    Pattern pattern = Pattern.compile("(INVALID|FAIL)", Pattern.CASE_INSENSITIVE);

    Matcher successMatcher = pattern.matcher(success);
    if(successMatcher.matches()==false){
        System.out.println("Success Matches");
    }
    Matcher rejectMatcher = pattern.matcher(reject);
    if(rejectMatcher.find()){
        System.out.println("Reject Matches");
    }
    Matcher falsePosMatcher = pattern.matcher(falsePositive);
    if(falsePosMatcher.find()){
        System.out.println("PseudoSuccess Matches");
    }

Пробовал с вышеуказанной программой, получил результат как

Успешные матчи

Отклонить совпадения

Псевдоуспешные совпадения

Это тот результат, который вы ожидаете?

person Mohan Raj    schedule 01.05.2015
comment
Нет, это не выход. Я пытаюсь сопоставить строку, которая не содержит недопустимых или ошибочных значений. Если вы используете 3 ссылки в комментариях, вы увидите желаемый результат. - person Dhwanit; 01.05.2015
comment
Также в вашем коде должна быть функция find(). Между ними есть разница. - person Dhwanit; 01.05.2015

После некоторой игры с кодом (спасибо Анубхаве за образец) и чтения вот что мне нужно.

^(?!.*?(INVALID|FAIL)).*$

Однако у меня есть сомнения по поводу моей предыдущей модели. Пожалуйста, прочитайте комментарии к вопросам, где я объяснил свои сомнения.

person Dhwanit    schedule 01.05.2015
comment
Это почти то же самое, что я вам предложил, и вы заметили, что это не работает в Java. - person anubhava; 01.05.2015