Подтвердить что ты не робот

В чем смысл + в регулярном выражении?

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

4b9b3361

Ответ 1

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

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


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

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

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

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


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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

[0-9]+

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

1234567890

В:

У меня есть 1234567890 долларов.