Чим регулярні вирази відрізняються від символів, які використовуються для фільтрації файлів


15

Поки ми використовуємо *для позначення нуля або більше попередніх символів grep, ми використовуємо *.cдля пошуку всіх файлів C, коли ми використовуємо його з такою lsкомандою, як ls *.c. Чи може хтось розповісти, як використання *в цих двох випадках відрізняється?

Відповіді:


30

Ім'я файлів оболонки в глобусі та регулярні вирази використовують одні й ті ж символи, і вони мають подібні цілі, але ви праві, вони не сумісні. Ім'я файлів - це набагато менш потужна система.

У глобальному імені файлу:

  • * означає "нуль або більше символів"

  • ? означає "будь-який єдиний символ"

Але в регулярних виразах ви повинні використовувати, .*щоб означати "нуль або більше символів", і .означає "будь-який один символ". A ?означає щось різне в регулярних виразах: нуль або один екземпляр попереднього елемента RE.

Квадратні дужки ( []), здається, працюють однаково в обох системах системи, на якій я набираю це, принаймні для простих випадків. Сюди входять такі речі, як класи символів POSIX (наприклад [:alpha:]). Це означає, що якщо вам потрібні ваші команди для роботи над багатьма різними типами системи, я рекомендую не використовувати нічого, крім елементарних речей, таких як списки символів (наприклад [abeq]) та, можливо, діапазони символів (наприклад [a-c]).

Ці відмінності означають, що дві системи є взаємозамінними лише для простих випадків. Якщо вам потрібна відповідність імен файлів з регулярними виразами, потрібно зробити це іншим способом. find -regexє одним із варіантів. (Зверніть увагу, що існує find -name, до речі, і синтаксис, що використовує глобус.)


2
Я не знаю, що його називали глобінг :)
user3539

3
Крім того, існують різні аромати регексу. Не всі регекси створені однаково! А у вас є багато інших систем відповідності шаблонів, таких як SQL, як , де це '%'означає '*'.
Пан Лістер

4
Два основних аромати regexp - POSIX та PCRE (Perl Compatible RE). Пізніший - менш довговічний і має деякі інші особливості. Інструменти та оболонки Unix зазвичай використовують POSIX, більшість мов програмування із вбудованими регулярними виразами (крім оболонки) використовують PCRE. Просто остерігайтеся різниці, коли ви читаєте матеріали в режимі он-лайн.
золотинки

11

Відповідаючи на питання, висловлене в оригінальній назві:

Чому регулярні вирази відрізняються від тих, які використовуються для фільтрації файлів?

Розширення імені файлів передує регулярним виразам, які вже існували в більшості операційних систем (символи підстановки / джокер) та набагато простіші та інтуїтивніші, ніж останні.

Хоча *.txtвипадкові користувачі легко зрозумілі, аналог .*\.txt- це щось більш націлене на досвідчених користувачів / програмістів, не кажучи вже про ^.*\.txt$...


2
Ще одна причина "чому" частини: швидкість. Регулярні вирази повільніші: pastebin.com/3iNCgkE3
manatwork

3
*.txtне дорівнює .*\.txt, вона (в основному) дорівнює .*\.txt$тому, що після .txt(принаймні, якщо розумне глобальне ім'я файлу) не може бути нічого . Можливо, навіть ^.*\.txt$дещо залежно від використання. Доводить свою думку?
CVn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.