Почему мои вложенные lookarounds не работают правильно в моей замене Perl? - PullRequest
1 голос
/ 10 октября 2011

У меня есть подстановка Perl, которая преобразует гиперссылки в нижний регистр:

's/(?<=<a href=")([^"]+)(?=")/\L$1/g'

Я хочу, чтобы подстановка игнорировала любые ссылки, начинающиеся с хэша, например, я хочу, чтобы она изменила путь в <a href="FooBar/Foo.bar">Foo Bar</a>в нижнем регистре, но пропустить, если он встретит <a href="#Bar">Bar</a>.

Вложенные подсказки для указания пропустить эти ссылки не работают для меня правильно.Это одна строчка, которую я написал:

perl -pi -e 's/(?<=<a href=" (?! (?<=<a href="#) ) )([^"]+)(?=")/\L$1/g' *;

Может кто-нибудь намекнуть мне, где я ошибся с этой заменой?Он работает просто отлично, но ничего не делает.

Ответы [ 2 ]

1 голос
/ 10 октября 2011

Тебе не нужны осмотры, из того, что я вижу

use 5.010;
...

s/<a \s+ href \s* = \s* "\K([^#"][^"]*)"/\L$1"/gx;

\K означает «держать» все перед собой. Это составляет для поиска переменной длины.

perlre:

По разным причинам \ K может быть значительно более эффективным, чем эквивалентная конструкция (?<=...), и это особенно полезно в ситуациях, когда вы хотите эффективно удалить что-то после чего-то еще в строке.

1 голос
/ 10 октября 2011

Насколько я могу судить, ваше начальное регулярное выражение будет работать нормально, если вы добавите условие, что первый символ в ссылке не может быть хешем # или двойной кавычкой, например [^#"]

s/(?<=<a href=")([^#"][^"]+)(?=")/\L$1/gi;

В случае, если у вас есть ссылки, которые не начинаются с хеша, например, <a href="FooBar/Foo.bar#BarBar">Foo Bar</a>, это становится немного сложнее:

s{(?<=<a href=")([^#"]+)(#[^"]+)*(?=")}{ lc($1) . ($2 // "") }gei;

Теперь мы должны оценить подстановку, так как в противном случаемы получаем неопределенные предупреждения о переменных, когда необязательная ссылка на якорь отсутствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...