Чем регулярные выражения отличаются от подстановочных знаков, используемых для фильтрации файлов


15

В то время как мы используем *для обозначения ноль или более предыдущих символов в grep, мы используем, *.cчтобы найти все файлы C, когда мы используем его с lsкомандой вроде ls *.c. Может кто-нибудь сказать, чем *отличается использование в этих двух случаях?

Ответы:


30

Глобализация имени файла оболочки и регулярные выражения используют одни и те же символы, и они имеют схожие цели, но вы правы, они не совместимы. Глобализация имени файла - гораздо менее мощная система.

В подстановке имени файла:

  • * означает «ноль или более символов»

  • ? означает «любой отдельный символ»

Но в регулярных выражениях вы должны использовать .*для обозначения «ноль или более символов» и .означает «любой отдельный символ». A ?означает нечто совершенно иное в регулярных выражениях: ноль или один экземпляр предыдущего элемента RE.

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

Эти различия означают, что две системы взаимозаменяемы только для простых случаев. Если вам нужно сопоставить имена файлов с помощью регулярных выражений, вам нужно сделать это по-другому. find -regexэто один из вариантов. (Обратите внимание, что find -name, кстати, также используется синтаксис glob.)


2
Я не знаю, это называлось globbing :)
user3539

3
Кроме того, есть различные вкусы регулярных выражений. Не все регулярные выражения созданы одинаково! И у вас есть много других систем сопоставления с образцом, таких как SQL, как , где '%'означает '*'.
Мистер Листер

4
Два основных варианта регулярного выражения - это POSIX и PCRE (Perl-совместимый 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.