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

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


person NoodleOfDeath    schedule 03.10.2010    source источник
comment
Не могли бы вы опубликовать образец?   -  person kennytm    schedule 03.10.2010
comment
^^ соответствует sample, samplee и sssaaaaaammmppplllllle, но не smple   -  person NoodleOfDeath    schedule 14.08.2016


Ответы (4)


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

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


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

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

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

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


1 В большинстве движков точка не соответствует символу новой строки, за исключением /s ("однострочный" или "точка") модификатор указан.

person Daniel Vandersluis    schedule 03.10.2010
comment
+1; Однако притяжательные квантификаторы работают только в Java, PCRE или механизме регулярных выражений JGSoft. Ruby, Perl и .NET используют атомарные группы (?>.*). - person Tim Pietzcker; 03.10.2010
comment
@ Тим Я намекал на это, но теперь я сделал это более явным в своем ответе. - person Daniel Vandersluis; 03.10.2010
comment
@Tim: Perl поддерживает притяжательные квантификаторы, вероятно, с версии 5.10. - person ninjalj; 03.10.2010
comment
@ninjalj: Спасибо за информацию. Похоже, что это сравнение больше не актуально. - person Tim Pietzcker; 03.10.2010
comment
Потрясающий ответ! Действительно помог мне понять + много. Спасибо. - person realnsleo; 27.09.2017

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

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

person sepp2k    schedule 03.10.2010

1 или более предыдущих выражений.

[0-9]+

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

1234567890

In:

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

person Chris    schedule 03.10.2010

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

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

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

person phimuemue    schedule 03.10.2010