[regexp] вопрос
sed 's/abc \(\([^x]\|x[^y]\|xy[^z]\).*\)/abc prefix_\1/'Полноценного отрицания в классических regexp-ах быть не должно. Но "не следует недооценивать перловые regexp-ы" (С)
то есть при линейном росте длины строки xyz строка выражения и время выполнения растут экспоненциально?
Можно сделать в два прохода.
s/abc (?!xyz.*)/abc prefix_$1/g;
строка выражения и время выполнения растут экспоненциальноДля тебя слово "экспоненциально", просто означает "нелинейно"? Как нетрудно видеть трезвым взглядом строка растет квадратично. Время выполнение зависит не от длины регэкспа а от сложности получающегося автомата. В данном случае подозреваю, что время вообще не будет меняться...
s/abc (?!xyz.*)/abc prefix_$1/g;В чем такое работает то? В vim-е и в sed-е не работает Перл?
Ага. Ты же сам сказал - не стоит его недооценивать
Оставить комментарий
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"