regex группа не работает

Так работает

\??&{0,2}?lang=\w+?&{0,2}$|lang=\w+&{0,2}
Так нет.
\??&{0,2}?(lang=)\w+?&{0,2}$|\1\w+&{0,2}


Ответы (1 шт):

Автор решения: vsemozhebuty

Если вы используете скобки и обратную ссылку по разные стороны знака альтернативного выбора, всё начинает работать не совсем очевидным образом.

Даже если в первой части альтернативы находится соответствие, вторая часть как бы забывает соответствие и его часть в скобках, так что обратная ссылка будет ссылаться на пустую строку и не будет включать ожидаемую часть, даже если она есть (и будет срабатывать, даже если её нет).

> 'abca'.match(/(a)b|c\1/g)
[ 'ab', 'c' ]
> 'abc'.match(/(a)b|c\1/g)
[ 'ab', 'c' ]

Если первая часть альтернативы не найдена, происходит то же самое: обратная ссылка ссылается на пустую строку и всегда будет срабатывать независимо от того, что идёт на месте ожидаемой части (и есть ли там вообще что-то:

> 'abcb'.match(/(a)a|c\1/g)
[ 'c' ]
> 'abc'.match(/(a)a|c\1/g)
[ 'c' ]
→ Ссылка