Почему этот код возвращает 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 » (что является ложным).