Путаница с регулярным выражением

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