Регулярные выражения VS Глобализация имени файла

15

Я знаю, что Регулярные выражения должны использоваться только с символами и строками, но иногда я нахожу их в именах файлов. Мой вопрос: регулярные выражения используются только с символами или также с именами файлов?

Хамза
источник

Ответы:

19

Регулярные выражения и глобализация имен файлов - это две разные вещи.

Регулярные выражения используются в командах / функциях для сопоставления с образцом в тексте. Например, в параметре шаблона grepили в языках программирования.

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

  • * соответствует 0 или более символов
  • ? соответствует 1 символ
  • [...] сопоставить символ в указанном наборе

Эти подстановочные знаки могут выглядеть аналогично регулярным выражениям, действительно [...]имеют то же значение в globbing и regex. Но *и ?имеют в виду разные вещи в globbing и regex.

В комментарии вы написали:

но в чем разница переводчика * будь то джокер или регулярное выражение? например: grep a*b a*.txt?

Легко. Вроде.

Прежде всего, оболочка пытается интерпретировать подстановочные знаки, сопоставляя их с именами файлов. Если есть файлы, начинающиеся с «а» и заканчивающиеся на «b», оболочка заменит a*bсоответствующие имена файлов. То же самое и для a*.txt. Если нет подходящих имен файлов, оболочка будет передавать аргументы в том grepвиде , в каком они были, в буквальном смысле.

Тем не менее, первый параметр grepдолжен быть шаблоном. В 99,999% случаев практического использования вы не хотите, чтобы первый параметр интерпретировался оболочкой. Таким образом, наиболее вероятное намерение было следующим:

grep "a*b" a*.txt

Благодаря цитированию a*bоболочка не будет интерпретировать его с помощью глобинга, а вместо этого передаст его напрямую grep. В свою очередь, grepбудет интерпретировать это как регулярное выражение (по замыслу).

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

Янош
источник
4

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

find ./ -regex '.*[abc][xyz].*'

Команда ищет файлы, в имени которых есть a, b или c, а затем x, y или z. Это только один пример. Есть бесконечные возможности.

никто
источник
но в чем разница переводчика * будь то джокер или регулярное выражение? например: $ grep a "звездочка" b a "звездочка" .txt
Хамза
2
Если вы используете, find ./ -name 'a*'вы используете * в качестве подстановочного знака. Когда вы печатаете find ./ -regex 'a*', вы используете * в регулярном выражении. Важным отличием является переключатель -nameили -regex.
никто не