Группа захвата, которая не соответствует, при включении во второй обратный вызов к .replace
, приведет к пустой строке.Таким образом, если группы 3 и 5 являются взаимоисключающими, и вы хотите сослаться на либо группу 3 или группу 5, в зависимости от того, что было найдено, вы можете просто написать $3$5
- тот, который был не matched просто приведет к пустой строке (поэтому это не вызовет проблем в результате).
let s = `
~"blah~
~'blah"~
~'blah'~
~blah"~
=blah"=
=blah'=`;
const replaced = s.replace(
/(=|~)(('|")(.*?)|(.*?)('|"))\1/g,
`<code>$2 and group 3 or 5 is [$3$5]</code>`
);
console.log(replaced);
Обратите внимание, что в этом случае более целесообразно использовать группы без захвата, а не группы захвата, если вы не хотите сохранять полученную группу для чего-либо, ибыло бы более разумно использовать набор символов, чем чередуясь внутри группы:
let s = `
~"blah~
~'blah"~
~'blah'~
~blah"~
=blah"=
=blah'=`;
const replaced = s.replace(
/([=~])((['"]).*?|(.*?)['"])\1/g,
`<code>$2 and group 3 or 4 is [$3$4]</code>`
);
console.log(replaced);
Обратите внимание, что группы 3 и 5 в вашем исходном коде ссылаются на кавычку (в первом чередовании) и текст (во втором чередовании), который кажется немного странным,Возможно, вы хотели текст в обоих:
let s = `
~"blah~
~'blah"~
~'blah'~
~blah"~
=blah"=
=blah'=`;
const replaced = s.replace(
/([=~])(['"](.*?)|(.*?)['"])\1/g,
`<code>$2 and group 3 or 4 is [$3$4]</code>`
);
console.log(replaced);