LINUX.ORG.RU

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

 


0

1

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

nicefile.png

badfile.sh

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

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

★★★★★

Последнее исправление: sniper21 (всего исправлений: 1)

Используйте либу для работы с путями для вашего языка и не морочьте голову.

RazrFalcon ★★★★★
()

Твои регулярки кодируют строки нулевой длины.

Lookahead-ы и lookbehind-ы не просто так называются zero width lookahead/lookbehind.

intelfx ★★★★★
()

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

massimus ★★★
()
ls | grep -v sh$
anonymous
()
ls | sed '/.sh$/ d'
anonymous
()
Ответ на: комментарий от sniper21

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

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

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

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

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

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

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

sniper21 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.