2016-06-03 4 views
2

Я ищу текст для строк, которые используют переменную2 без точки с запятой перед ней в строке. Вот мое регулярное выражение, чтобы решить эту проблему.Не жадное регулярное выражение, не соответствующее ожидаемому

^[^;]*?variable2

Мое понимание этого является то, что он должен найти текст, начиная с новой строки, которая сводит к минимуму количество не символов запятой и «variable2». Это не позволяет выбрать то, что я ожидаю в этом примере.


Label0: mov  variable0,WREG    ;Some comment 
     mov  W0,variable1 

Label1: btsc variable2,#1    ;Some other comment 
     bra  label2 

Я ожидал получить эту

Label1: btsc variable2

но выбран этот вместо

 mov  W0,variable1 

Label1: btsc variable2

Что я недопонимание? Мне кажется, что негласное выражение не делает то, что я намеревался сделать. Если я изменю свое регулярное выражение на ^[^;\n]*?variable2, он выбирает, что я ожидаю от него. Я использую Sublime Text 2 для своих регулярных выражений, но я, похоже, получаю те же результаты в php, javascript и python (согласно regex101.com).

ответ

1

Вы получаете ключевой момент ленивым согласования некорректного здесь: Он не пытается найти общее кратчайшее матч, но он пытается найти кратчайший возможный матч с самого начала. Возьмем гораздо более короткое регулярное выражение, чтобы показать это: a*?b. Учитывая последовательность aab, вы ожидаете, что ленивый матч соответствует ab, но соответствует aab.

Парсер regex начинается с первого символа в строке (первый a) и соответствует ему ленивым. Затем он продолжается, но не соответствует b, поскольку второй символ по-прежнему равен a. Затем он расширяет шаблон в соответствии с aa и теперь может успешно соответствовать b, что дает общее соответствие aab.

+0

Да, я думал, что он будет активно искать более короткий набор символов для соответствия. Я всегда называл это не жадным, но ленивый - это гораздо более описательное слово. – Westin

2

^[^;]*?variable2

Это регулярное выражение соответствует ничего, кроме ; от начала линии до variable2 .Since линии 2 и 3 (только символ новой строки) также не содержит какие-либо ; они совпадают, начиная с самого начала 2-й линии до variable2. Поскольку вы используете многострочный режим, ^ действует как привязка для каждой строки.

Demo

^[^;\n]*?variable2

Это регулярное выражение соответствует ничего, кроме ; и \n от начала линии до variable2. Строка 2 и строка 3 не сопоставляются, так как они содержат \n.

Demo

0

Вы можете использовать отрицательный предпросмотр:

^(?:(?!;).)+variable2 

См a demo on regex101.com (и ум модификатор multiline!).

^   # matches the beginning of the line 
(?:(?!;).)+ # match any character except a newline 
      # and make sure what immediately follows 
      # is not a semicolon 
variable2 # match variable2 
Смежные вопросы