Отрицательное регулярное выражение не работает - PullRequest
2 голосов
/ 24 марта 2011
input1="caused/VBN by/IN thyroid disorder"

Требование: найдите слово "caused", за которым следует косая черта, за которым следует любое количество прописных алфавитов, а не пробел + "by/IN.

В вышеприведенном примере за "caused/VBN" следует " by/IN", поэтому «вызвано» не должно совпадать.

input2="caused/VBN thyroid disorder" 

"by/IN" не соответствует вызванному, поэтому должно соответствовать

regex="caused/[A-Z]+(?![\\s]+by/IN)"

caused/[A-Z]+ - слово «вызвало» + / + одна или несколько заглавных букв
(?![\\s]+by) - отрицательный взгляд - не соответствует пробелу и

Ниже приведен простой метод, который я использовал для проверки

public static void main(String[] args){
    String input = "caused/VBN by/IN thyroid disorder";

    String regex = "caused/[A-Z]+(?![\\s]+by/IN)";

    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(input);

    while(matcher.find()){
        System.out.println(matcher.group());
    }

Вывод: caused/VB

Я не понимаю, почему мое отрицательное регулярное выражение не работает.

Ответы [ 2 ]

7 голосов
/ 24 марта 2011

Вы должны включить границу слова в ваше регулярное выражение:

String regex = "caused/[A-Z]+\\b(?![\\s]+by/IN)";

Без него вы можете получить матч, но не то, что ожидали:

"caused/VBN by/IN thyroid disorder";
 ^^^^^^^^^
 this matches because "N by" doesn't match "[\\s]+by"
3 голосов
/ 24 марта 2011

Класс персонажа [] + match будет скорректирован (с помощью обратного отслеживания) так, чтобы поиск соответствовал.

Что вам нужно сделать, это остановить возврат, чтобы выражение [] + полностью соответствовало.
Это можно сделать несколькими разными способами.

  1. Позитивный прогноз, за ​​которым следует потребление
    "caused(?=(/[A-Z]+))\\1(?!\\s+by/IN)"

  2. Автономное под-выражение
    "caused(?>/[A-Z]+)(?!\\s+by/IN)"

  3. Позитивный квантификатор
    "caused/[A-Z]++(?!\\s+by/IN)"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...