Недавно я вступил в дружеский спор с Готи о том, что является регулярным выражением в комментариях к моему ответу на этот вопрос. Я утверждал, что следующее является регулярным выражением:
`[Rr]eading[Tt]est[Dd]ata`
Готи не согласен с этим, утверждая, что это файл. Глоб страница на Википедии утверждает , что (курсив мой):
Глобусы не включают синтаксис звезды Клини, который допускает многократное повторение предыдущей части выражения; таким образом, они не считаются регулярными выражениями, которые могут описывать больший набор регулярных языков по любому заданному конечному алфавиту.
Тем не менее, нет никаких ссылок на это утверждение, что указывает на то, что это просто мнение редактора Википедии.
В спецификации Single UNIX ® версии 2 указано, что базовое регулярное выражение (BRE) может быть даже одним символом:
Обычный символ - это BRE, который соответствует самому себе: любой символ в поддерживаемом наборе символов, за исключением специальных символов BRE, перечисленных в специальных символах BRE.
Итак, каково определение регулярного выражения в мире * nix, и исключает ли это определение файловые глобусы?
источник
grep
,sed
, иawk
. Vim использует свое собственное разнообразие, как и Perl.*
имеет два разных значения в BRE и globs. Примечание: я не думаю, что термин glob используется где-либо в спецификации POSIX - вместо этого он называется Pattern Matching и описан в главе о языке оболочки.Ответы:
Как lk- сказал, вариант будет рассматривать аргумент как Glob, а не регулярное выражение.
-name
find
Будет ли строка интерпретироваться как глобус, регулярное выражение или просто простая строка, зависит от того, что используется для интерпретации. Это вопрос контекста. Строка в вашем примере,
[Rr]eading[Tt]est[Dd]ata
может быть оценена в ряде различных способов, но что это зависит от того, как вы используете его. Используйте это как шар, это шар. Используйте это как регулярное выражение, это регулярное выражение. В случае вопроса, откуда это произошло , OP описал строку как регулярное выражение. Поэтому мы можем предположить, что он планировал интерпретировать это как регулярное выражение.Отдельный символ также может быть регулярным выражением. Это также может быть строка и глобус. Это может быть интерпретировано как байт или крошечный, если хотите. Все зависит от контекста.
Существует ряд спецификаций для регулярных выражений в различных формах. BRE и ERE хорошо документированы. PCRE добавляет множество функциональных возможностей. Многие интерпретаторы регулярных выражений будут реализовывать, например, «все ERE и некоторые из PCRE». Или они сделают ERE минус некоторую особенность. Если следовать формальным спецификациям, многие инструменты утверждают, что поддержка регулярных выражений оказывается неверной или неполной. Знание деталей позволяет адаптировать ваши решения к набору функциональных возможностей, доступных в любом инструменте, который оценивает ваше регулярное выражение.
Итак ... если вы ищете определения, которые "исключают" глобусы, вы смотрите на это с неправильной точки зрения. Что это такое , определяется тем, как вы его используете .
источник
[Rr]eading[Tt]est[Dd]ata
кажется действительным и как глобус, и как регулярное выражение, и я считаю, что имеет одинаковое значение в обеих интерпретациях. Однако-name
опцияfind
будет рассматривать аргумент как глобус, а не как регулярное выражение.Это различие будет иметь значение, если вы предоставите такой аргумент, как
foo*
, который является допустимым глобальным и допустимым регулярным выражением, но имеет различное значение в зависимости от интерпретации:Если интерпретировать как шаблон Глобы, это будет соответствовать
foo
,foobar
,foo123
и т.д.Если интерпретировать как регулярное выражение, это будет соответствовать
fo
,foo
,foooooo
и т.д.источник