Основная путаница, похоже, заключается в том, что обратные ссылки не похожи на «подпрограммы регулярных выражений»;они не позволяют вам повторно использовать части шаблона в другом месте.То, что они делают, они позволяют вам соответствовать точную строку, которая была найдена ранее.
Например:
console.log(/(\w)\1/.test('AB'));
console.log(/(\w)\1/.test('AA'));
console.log(/(\w)\1/.test('BB'));
(\w)\1
не соответствует AB
, но соответствует AA
и BB
.Часть \1
соответствует только той строке, которая была ранее найдена группой (\w)
.
В вашем случае,
(?<=(["'])(?!\.)).*?(?=\1)
|
((?!\1|\.).)+
, есть две ветви, разделенные |
.Вторая ветвь содержит обратную ссылку (\1
) на группу захвата в первой ветке ((["'])
).
Это никогда не может совпадать, потому что вторая ветвь пробуется только в том случае, если первая ветвь не может что-либо сопоставить, но в этом случае первая группа захвата также не смогла сопоставить что-либо, так на какую строку будет ссылаться \1
?
Если группа захвата, на которую ссылается обратная ссылка, никогда ничего не совпадает, браузеры ведут себя так, как если бы это былопустая строка.
Пустая строка всегда совпадает, поэтому (?!\1)
всегда терпит неудачу.