Что означает + в регулярном выражении? - PullRequest
29 голосов
/ 03 октября 2010

Что означает символ плюс в регулярном выражении?

Ответы [ 4 ]

58 голосов
/ 03 октября 2010

+ может иметь два значения в зависимости от контекста.

Как и другие упомянутые ответы, + обычно является оператором повторение и вызывает повторение предыдущего токена один или несколько раз. a+ будет выражаться как aa* в теории формального языка , а также может быть выражено как a{1,} (соответствует минимум 1 раз и максимум бесконечный период).


Однако, + может также сделать другие квантификаторы притяжательными , если он следует за оператором повторения (т. Е. ?+, *+, ++ или {<i>m</i>,<i>n</i>}+). Притяжательный квантификатор - это расширенная функция некоторых разновидностей регулярных выражений (PCRE, Java и движок JGsoft), которая предписывает движку не возвращаться после установления соответствия.

Чтобы понять, как это работает, нам нужно понять две концепции движков регулярных выражений: жадность и возврат . Жадность означает, что в целом регулярные выражения будут пытаться потреблять как можно больше символов. Допустим, наш шаблон .* ( точка - это специальная конструкция в регулярных выражениях, которая означает любой символ 1 ; звезда означает совпадение ноль или более раз) и ваша цель aaaaaaaab. Будет использована вся строка, так как вся строка является самым длинным соответствием, которое удовлетворяет шаблону.

Однако, допустим, мы изменили шаблон на .*b. Теперь, когда механизм регулярных выражений пытается сопоставить с aaaaaaaab, .* снова будет использовать всю строку. Однако, поскольку двигатель достигнет конца строки и шаблон еще не удовлетворен (.* потребляет все, но шаблон все еще должен совпадать с b впоследствии), он будет возвращаться , один символ за раз, и попытайтесь соответствовать b. Первое возвращение заставит .* потреблять aaaaaaaa, а затем b может потреблять b, и шаблон будет успешным.

Притяжные квантификаторы также являются жадными, но, как уже упоминалось, как только они возвращают совпадение, двигатель больше не может возвращаться назад после этой точки. Поэтому, если мы изменим наш шаблон на .*+b (сопоставим любой символ ноль или более раз собственнически, за которым следует b), и попытаемся сопоставить aaaaaaaab, снова .* будет использовать всю строку, но затем поскольку он является притяжательным, информация обратного отслеживания отбрасывается, и b не может быть сопоставлено, поэтому шаблон не выполняется.


1 В большинстве движков точка не будет соответствовать символу новой строки, если не указан модификатор *1063* .

12 голосов
/ 03 октября 2010

В большинстве реализаций + означает «один или несколько».

В некоторых теоретических работах + используется для обозначения «или» (в большинстве реализаций для этого используется символ |).

6 голосов
/ 03 октября 2010

1 или более из предыдущего выражения.

[0-9]+

Будет соответствовать:

1234567890

В:

У меня 1234567890 долларов

3 голосов
/ 03 октября 2010

Один или несколько вхождений предыдущих символов.

Например, a+ означает букву a один или несколько раз.Таким образом, a соответствует a, aa, aaaaaa, но не пустой строке.

Если вы знаете, что означает звездочка (*), то вы можете выразить (exp)+ как(exp)(exp)*, где (exp) - любое регулярное выражение.

...