Почему этот код возвращает true?
строка для соответствия: ab
pattern: /^a|b$/
но когда я помещаю круглые скобки следующим образом:
pattern: /^(a|b)$/
он затем вернет false
.
Первый шаблон без скобок эквивалентен /(^a)|(b$)/
.
Причина в том, что оператор трубы («оператор чередования») имеет самый низкий приоритет всех операторов регулярных выражений: http://www.regular-expressions.info/alternation.html (третий абзац ниже первого заголовка)
/^a|b$/
соответствует строке, которая начинается с символа a
заканчивается на b
. Так что это соответствует afoo
, afoo
, a
, b
.
/^(a|b)$/
: Соответствует строке, которая начинается и заканчивается символом a
или b
. Таким образом, он соответствует либо a
либо b
и ничто другое.
Это происходит потому, что изменение |
имеет очень низкий приоритет среди операторов регулярных выражений.
Связанная дискуссия
Первое средство начинается с a
или end с b
.
Второй означает 1 символ, a
или b
.
В ^a|b$
вы соответствуете для a
в начале или b
в конце.
В ^(a|b)$
вы сопоставляетесь для a
или b
являющегося единственным символом (в начале и в конце).
|
имеет меньший приоритет, чем якоря, поэтому вы говорите либо ^a
либо b$
(что истинно), а не второе, что означает «одна символьная строка, либо a
либо b
» (что является ложным).