2013-08-02 4 views
15

просмотра назад У меня есть следующие Java-код:Java RegEx отрицательный

Pattern pat = Pattern.compile("(?<!function)\\w+"); 
Matcher mat = pat.matcher("function example"); 
System.out.println(mat.find()); 

Почему mat.find() возвращение верно? Я использовал отрицательный lookbehind и example предшествует function. Не следует ли его отбрасывать?

ответ

29

Посмотрите, что он соответствует:

public static void main(String[] args) throws Exception { 
    Pattern pat = Pattern.compile("(?<!function)\\w+"); 
    Matcher mat = pat.matcher("function example"); 
    while (mat.find()) { 
     System.out.println(mat.group()); 
    } 
} 

Выход:

function 
xample 

Итак, сначала он находит function, который не предшествует "function". Затем он находит xample, которому предшествуют function e и поэтому не «function».

Предположительно вы хотите шаблон для сопоставления текста с весь, а не просто найти матчи в тексте.

Вы можете сделать это с помощью Matcher.matches() или вы можете изменить шаблон, чтобы добавить начальные и конечные якоря:

^(?<!function)\\w+$ 

Я предпочитаю второй подход, поскольку это означает, что сама модель определяет свою область соответствия, а затем регион определяется его использованием. Однако это вопрос предпочтения.

1

В вашей строке есть слово «функция», которое соответствует \ w +, и ему не предшествует «функция».

0

Примечание две вещи здесь:

  • Вы используете find(), который возвращает истинную для подстрок матча, а также.

  • Из-за вышеизложенного «функция» соответствует, поскольку ей не предшествует «функция».
    Вся строка никогда бы не соответствовала, потому что ваше регулярное выражение не включает пробелы.

Использование Mathcher#matches() или ^ и $ якоря с отрицательного предпросмотра вместо:

Pattern pat = Pattern.compile("^(?!function)[\\w\\s]+$"); // added \s for whitespaces 
Matcher mat = pat.matcher("function example"); 

System.out.println(mat.find()); // false 

 Смежные вопросы

  • Нет связанных вопросов^_^