[regexp] вопрос

maxiim9

как написать регулярное выражение с отрицанием подстроки?
то есть надо, чтобы подстроки вида "abc (.*)" заменялись на "abc prefix_\1", но при условии, что подстрока после "abc " не начинается с "xyz".
Пример:
1) "abc abc" => "abc prefix_abc"
2) "abc xyz wty" => "abc xyz wty"
3) "abc zyx wty" => "abc prefix_zyx wty"

rosali

 sed 's/abc \(\([^x]\|x[^y]\|xy[^z]\).*\)/abc prefix_\1/' 
Полноценного отрицания в классических regexp-ах быть не должно. Но "не следует недооценивать перловые regexp-ы" (С)

maxiim9

то есть при линейном росте длины строки xyz строка выражения и время выполнения растут экспоненциально?

ruler

Можно сделать в два прохода.

ppplva

s/abc (?!xyz.*)/abc prefix_$1/g;

rosali

строка выражения и время выполнения растут экспоненциально
Для тебя слово "экспоненциально", просто означает "нелинейно"? Как нетрудно видеть трезвым взглядом строка растет квадратично. Время выполнение зависит не от длины регэкспа а от сложности получающегося автомата. В данном случае подозреваю, что время вообще не будет меняться...

rosali

s/abc (?!xyz.*)/abc prefix_$1/g;
В чем такое работает то? В vim-е и в sed-е не работает Перл?

ppplva

Ага. Ты же сам сказал - не стоит его недооценивать
Оставить комментарий
Имя или ник:
Комментарий: