Чем регулярные выражения отличаются от подстановочных знаков, используемых для фильтрации файлов
15
В то время как мы используем *для обозначения ноль или более предыдущих символов в grep, мы используем, *.cчтобы найти все файлы C, когда мы используем его с lsкомандой вроде ls *.c. Может кто-нибудь сказать, чем *отличается использование в этих двух случаях?
Но в регулярных выражениях вы должны использовать .*для обозначения «ноль или более символов» и .означает «любой отдельный символ». A ?означает нечто совершенно иное в регулярных выражениях: ноль или один экземпляр предыдущего элемента RE.
Квадратные скобки ( []), кажется, работают одинаково в обеих системах в системе, на которой я это печатаю, по крайней мере, для простых случаев. Это включает в себя такие вещи, как классы символов POSIX (например [:alpha:]). Тем не менее, если вам нужно, чтобы ваши команды работали на многих различных типах систем, я рекомендую не использовать ничего, кроме элементарных вещей, таких как списки символов (например [abeq]) и, возможно, диапазоны символов (например [a-c]).
Эти различия означают, что две системы взаимозаменяемы только для простых случаев. Если вам нужно сопоставить имена файлов с помощью регулярных выражений, вам нужно сделать это по-другому. find -regexэто один из вариантов. (Обратите внимание, что find -name, кстати, также используется синтаксис glob.)
Кроме того, есть различные вкусы регулярных выражений. Не все регулярные выражения созданы одинаково! И у вас есть много других систем сопоставления с образцом, таких как SQL, как , где '%'означает '*'.
Мистер Листер
4
Два основных варианта регулярного выражения - это POSIX и PCRE (Perl-совместимый RE). Последний менее скучный и имеет некоторые дополнительные функции. Инструменты и оболочки Unix обычно используют POSIX, большинство языков программирования со встроенными регулярными выражениями (кроме оболочки) используют PCRE. Просто остерегайтесь разницы, когда вы читаете материал в Интернете.
Златовласка
11
Отвечая на вопрос, выраженный в оригинальном заголовке:
Почему регулярные выражения отличаются от используемых для фильтрации файлов?
Расширение имени файла предшествует регулярным выражениям, уже существующим в большинстве операционных систем (подстановочные знаки / символы джокера), и намного проще и интуитивнее, чем последние.
Хотя *.txtэто легко понять обычным пользователям, аналогия .*\.txtболее ориентирована на опытных пользователей / программистов, не говоря уже о ^.*\.txt$...
Еще одна причина для «почему» часть: скорость. Регулярные выражения работают медленнее: pastebin.com/3iNCgkE3
manatwork
3
*.txtне равно .*\.txt, оно (в основном) равно, .*\.txt$потому что после ничего не может быть .txt(по крайней мере, при условии разумного искажения имени файла). Возможно даже ^.*\.txt$несколько в зависимости от использования. Доказывает вашу точку зрения?
'%'
означает'*'
.Отвечая на вопрос, выраженный в оригинальном заголовке:
Расширение имени файла предшествует регулярным выражениям, уже существующим в большинстве операционных систем (подстановочные знаки / символы джокера), и намного проще и интуитивнее, чем последние.
Хотя
*.txt
это легко понять обычным пользователям, аналогия.*\.txt
более ориентирована на опытных пользователей / программистов, не говоря уже о^.*\.txt$
...источник
*.txt
не равно.*\.txt
, оно (в основном) равно,.*\.txt$
потому что после ничего не может быть.txt
(по крайней мере, при условии разумного искажения имени файла). Возможно даже^.*\.txt$
несколько в зависимости от использования. Доказывает вашу точку зрения?