Какое определение для регулярного выражения?


10

Недавно я вступил в дружеский спор с Готи о том, что является регулярным выражением в комментариях к моему ответу на этот вопрос. Я утверждал, что следующее является регулярным выражением:

`[Rr]eading[Tt]est[Dd]ata`

Готи не согласен с этим, утверждая, что это файл. Глоб страница на Википедии утверждает , что (курсив мой):

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

Тем не менее, нет никаких ссылок на это утверждение, что указывает на то, что это просто мнение редактора Википедии.

В спецификации Single UNIX ® версии 2 указано, что базовое регулярное выражение (BRE) может быть даже одним символом:

Обычный символ - это BRE, который соответствует самому себе: любой символ в поддерживаемом наборе символов, за исключением специальных символов BRE, перечисленных в специальных символах BRE.

Итак, каково определение регулярного выражения в мире * nix, и исключает ли это определение файловые глобусы?


6
В теоретической CS регулярное выражение - это описание регулярного языка, который может быть распознан конечным автоматом. В мире Unix все намного сложнее и единого определения не существует. Есть 2 регулярных выражения диалектов в POSIX спецификации: расширенные и базовые, которые используются такими инструментами , как grep, sed, и awk. Vim использует свое собственное разнообразие, как и Perl.
jw013

Итак, по этому определению, файловый глобус - это BRE, верно?
Тердон

2
Нет, файловый глобус НЕ является BRE - что заставляет вас думать, что это так? Если вы прочитаете описание POSIX BRE и описание глобализации POSIX, вы заметите, что они не совпадают. Например, *имеет два разных значения в BRE и globs. Примечание: я не думаю, что термин glob используется где-либо в спецификации POSIX - вместо этого он называется Pattern Matching и описан в главе о языке оболочки.
jw013

Ответы:


10

Как lk- сказал, вариант будет рассматривать аргумент как Glob, а не регулярное выражение.-namefind

Будет ли строка интерпретироваться как глобус, регулярное выражение или просто простая строка, зависит от того, что используется для интерпретации. Это вопрос контекста. Строка в вашем примере, [Rr]eading[Tt]est[Dd]ataможет быть оценена в ряде различных способов, но что это зависит от того, как вы используете его. Используйте это как шар, это шар. Используйте это как регулярное выражение, это регулярное выражение. В случае вопроса, откуда это произошло , OP описал строку как регулярное выражение. Поэтому мы можем предположить, что он планировал интерпретировать это как регулярное выражение.

Отдельный символ также может быть регулярным выражением. Это также может быть строка и глобус. Это может быть интерпретировано как байт или крошечный, если хотите. Все зависит от контекста.

Существует ряд спецификаций для регулярных выражений в различных формах. BRE и ERE хорошо документированы. PCRE добавляет множество функциональных возможностей. Многие интерпретаторы регулярных выражений будут реализовывать, например, «все ERE и некоторые из PCRE». Или они сделают ERE минус некоторую особенность. Если следовать формальным спецификациям, многие инструменты утверждают, что поддержка регулярных выражений оказывается неверной или неполной. Знание деталей позволяет адаптировать ваши решения к набору функциональных возможностей, доступных в любом инструменте, который оценивает ваше регулярное выражение.

Итак ... если вы ищете определения, которые "исключают" глобусы, вы смотрите на это с неправильной точки зрения. Что это такое , определяется тем, как вы его используете .


7

[Rr]eading[Tt]est[Dd]ataкажется действительным и как глобус, и как регулярное выражение, и я считаю, что имеет одинаковое значение в обеих интерпретациях. Однако -nameопция findбудет рассматривать аргумент как глобус, а не как регулярное выражение.

Это различие будет иметь значение, если вы предоставите такой аргумент, как foo*, который является допустимым глобальным и допустимым регулярным выражением, но имеет различное значение в зависимости от интерпретации:

Если интерпретировать как шаблон Глобы, это будет соответствовать foo, foobar, foo123и т.д.

Если интерпретировать как регулярное выражение, это будет соответствовать fo, foo, fooooooи т.д.


Спасибо, я вижу разницу между шаблоном глобуса и регулярным выражением. Каково формальное определение регулярного выражения, хотя?
Тердон

1
Я не знаю, существует ли единственное определение для «регулярных выражений», поскольку этот термин обычно используется. Существуют различные спецификации синтаксиса, такие как регулярные выражения POSIX или регулярные выражения Perl, которые включают в себя другие «функции», такие как обратные ссылки или предпросмотры. Они могут больше не быть регулярными выражениями в самом строгом смысле (в контексте регулярных формальных языков), но все еще упоминаются как таковые.
12
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.