LINUX.ORG.RU

отрицание в регулярных выражениях

 


0

1

хочу отсеять *.sh скрипты чтобы не пролезали

nicefile.png

badfile.sh

Хочу это делать с конца строки, это возможно при помощи отрицания ^(?!sh)$ + обратного просмотра ^(?<!sh)$ ?

проверяю в онлайн проверяльщике, но не работает.

★★★★★

Онлайн-проверялка точно поддерживает look-ahead?
И у тебя вокруг скобок начало строки ^ и конец строки $
По идее «имя с расширением не .sh» должно быть что-то типа .+\.(?!sh)

massimus ★★★ ()
Ответ на: комментарий от sniper21

и что это значит?

Это значит, пора читать Фридла :)
Указатели нулевой длины указывают не на символы, а на место перед/после символами. Например, есть строка send more money. Для регулярки там помимо символов букв и пробелов есть ещё и места нулевой длины, на которые можно ссылаться: ^ — начало строки; $ — конец строки; \b — граница слова. Примерно вот так: ^\bsend\b \bmore\b \bmoney\b$. Lookahead и lookbehind — такой же нулевой ширины, то есть (?!sh) совпадает не с какими-то символами, а с местом, после которого нет sh.

Я думал что регулярка ?<! работает с конца строки и все.

(?<!sh) как раз проверяет, что у тебя нет sh перед этим местом.

massimus ★★★ ()
Ответ на: комментарий от massimus

Lookahead и lookbehind — такой же нулевой ширины, то есть (?!sh) совпадает не с какими-то символами, а с местом, после которого нет sh.

Вроде бы все понял. :) Спасибо.

sniper21 ★★★★★ ()