2015-11-22 2 views
0

Я следующий текст сохранить в виде файла и пытается сделать регулярное выражениенулевой ширины отрицательный взгляд вперед утверждение Perl

line1 brown fox 
line2 black owl 
line3 red dear 

Когда я пытаюсь выполнить следующую PERL команды,

perl -ne 'print if /(line.*)(?!.*fox)/' text.txt 

это печать все три строки (вместо печати строк2 и строки3).
Как это соответствует первой строке? я получить ожидаемые результаты, если я использую следующую PERL Заявления о

perl -ne 'print if /(line)(?!.*fox)/' text.txt 

Благодаря

ответ

3

Все три строки успешно совпадает, потому что .* предшествующего опережения жадно соответствие каждого символа и сожрал всю строку. Затем движок попытается утверждать, что то, что следует в строке, не является «foo»; откат до .* внутри lookahead и жадно повторяющийся, пока он не подтвердит в конце позиции строки.

Поместите lookahead в начале строки, чтобы утверждать, что в текущей позиции и что не следует «лиса». Если результат выглядит успешно, двигатель будет продолжать соответствовать.

perl -ne 'print if /^(?!.*fox).*/' text.txt 

выше будет смотреть вперед, чтобы увидеть, если нет какой-либо символ (, кроме символа новой строки) или «лис». В случае успеха затем сопоставьте любой символ (, кроме новой строки), то есть целую строку.

+0

Ok если линия *. потребляет всю строку, прежде чем lookahead даже попытается, то почему следующий оператор возвращает правильный результат perl -ne 'print if /(line.*)(?=.*fox)/' text.txt .... когда это утверждение Я получаю только строку1. – user2896215

+0

Поскольку механизм регулярных выражений найдет способ совпадения, если он есть. Ваша первоначальная попытка исключает одно возможное совпадение, но движок просто находит другое. Напротив, это решение находит совпадение в отрицательном представлении, если оно есть. – tripleee

+0

@hwnd: (строка. *), Соответствующая всем трем строкам, и обрабатывает каждую строку как целую цепочку, но если я заменяю отрицательный результат с положительным, то не дает ожидаемого результата .... так что если я использую следующий скрипт perl -ne 'print if /(line.*)(?!.*fox)/; печать «$ 1 \ П»»test3.txt line1 коричневая лиса line1 коричневая лиса строка2 черная сова строка2 черная сова line3 красный дорогой line3 красный дорогой затем печати первой группы ($ 1) показывает, что вся линия подобрана (line. *), как видно из выходов. – user2896215

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