Является ли плюс (+) частью основных регулярных выражений? - PullRequest
0 голосов
/ 26 декабря 2018

Недавно мне сказали, что + (одно или несколько вхождений предыдущего шаблона / символа) не является частью основного регулярного выражения.Даже когда написано как \+.

Это был вопрос о максимальной совместимости.

У меня сложилось впечатление, что ...

echo "Hello World, I am an example-text" | sed 's#[^a-z0-9]\+#.#ig'

..всегда приводит к:

Hello.World.I.am.an.example.text

Но потом мне сказали, что «он заменяет каждый символ не строчными или цифрами, сопровождаемыми +» и что это то же самое, что [^a-z0-9][+].

Таким образом, мой реальный вопрос: существует ли какое-либо определение или реализация регулярного выражения, которая не обрабатывает x+ или x\+ так же, как xx*.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

«базовые» регулярные выражения POSIX не поддерживают + (ни ?!) .В большинстве реализаций sed добавлена ​​поддержка \+, но это не стандартная функция POSIX.Если ваша цель - максимальная мобильность, вам следует избегать ее использования.Обратите внимание, что вы должны использовать \+ вместо более распространенного +.

echo "Hello World, I am an example-text" | sed 's#[^a-z0-9]\+#.#ig'

. Флаг -E включает «расширенные» регулярные выражения, которые намного ближе к синтаксису, используемому в Perl., JavaScript и большинство других современных движков регулярных выражений.С -E вам не нужно иметь обратную косую черту;это просто +.

echo "Hello World, I am an example-text" | sed -E 's#[^a-z0-9]+#.#ig'

From https://www.regular -expressions.info / posix.html :

POSIX или «Портативный интерфейс операционной системы».for uniX "- это набор стандартов, которые определяют некоторые функции, которые должна поддерживать операционная система (UNIX).Один из этих стандартов определяет два вида регулярных выражений.Команды, включающие регулярные выражения, такие как grep и egrep, реализуют эти разновидности в POSIX-совместимых системах UNIX.Некоторые системы баз данных также используют регулярные выражения POSIX.

Базовые регулярные выражения или разновидность BRE стандартизируют разновидность, аналогичную той, которая используется традиционной командой UNIX grep.Это в значительной степени самая старая версия регулярных выражений, используемая до сих пор. Одна особенность, которая выделяет этот аромат, состоит в том, что большинству метасимволов требуется обратный слеш, чтобы придать метасимволу его вкус. Большинство других разновидностей, включая POSIX ERE, используют обратную косую черту для подавления значения метасимволов.Использование обратной косой черты для экранирования символа, который никогда не является метасимволом, является ошибкой.

BRE поддерживает выражения в скобках POSIX, которые аналогичны классам символов в других вариантах regex, с некоторыми специальными функциями.Сокращения не поддерживаются.Другими особенностями, использующими обычные метасимволы, являются точка, соответствующая любому символу, кроме разрыва строки, символ каретки и доллар, соответствующий началу и концу строки, и звезда, повторяющая токен ноль или более раз.Чтобы буквально сопоставить любой из этих символов, избегайте их с обратной косой чертой.

Другие метасимволы BRE требуют обратной косой черты, чтобы придать им особое значение.Причина в том, что самые старые версии UNIX grep не поддерживали их.Разработчики grep хотели сделать его совместимым с существующими регулярными выражениями, которые могут использовать эти символы в качестве буквенных символов.BRE a{1,2} соответствует буквально a{1,2}, а a\{1,2\} соответствует a или aa. Некоторые реализации поддерживают \? и \+ в качестве альтернативного синтаксиса \{0,1\} и \{1,\}, но \? и \+ не являются частью стандарта POSIX. Токены можно сгруппировать с помощью\( и \).Обратные ссылки обычные от \1 до \9.Допускается только до 9 групп.Например, \(ab\)\1 соответствует abab, в то время как (ab)\1 недопустимо, поскольку нет группы захвата, соответствующей обратной ссылке \1.. Используйте \\1 для буквального соответствия \1.

POSIX BRE не поддерживает никакихдругие преимущества.Даже чередование не поддерживается.

(выделение мое).


Поэтому мой реальный вопрос: есть ли какое-либо определение или реализация регулярного выражения, которая не обрабатывает ни x+ или x\+ тоже самое, что xx*.

Я не могу вспомнить ни один язык или инструмент реального мира, который бы не поддерживал ни +, ни \+.

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

  1. Объединение: AB соответствует A , за которым следует B .
  2. Чередование: A | B соответствует либо A или B .
  3. Звезда Клини: R * соответствует 0 или более повторениям R .

Этих трех операций достаточно, чтобы дать полную выразительную силу регулярным выражениям .Операторы типа ? и + удобны в программировании, но не обязательны в математическом контексте.При необходимости они определяются в терминах остальных: R? - R | ε и R + - RR *.


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

0 голосов
/ 26 декабря 2018

В некоторых традиционных sed реализациях необходимо включить «расширенные» регулярные выражения, чтобы получить поддержку для + в значении «один или несколько».

В подтверждение этого см .: знак сед плюс не работает

...