регулярное выражение: ссылка на чередование групп - PullRequest
0 голосов
/ 02 января 2019

хочу заменить на такую ​​строку

let s = `
~"blah~
~'blah"~
~'blah'~
~blah"~
=blah"=
=blah'=`

Вы можете получить мое намерение из этого работоспособного кода

s = s.replace(/(=|~)('|")(.*?)\1/g, `<code>$2$3</code>`)
     .replace(/(=|~)(.*?)('|")\1/g, `<code>$2$3</code>`)

сейчас s это

<code>"blah</code>
<code>'blah"</code>
<code>'blah'</code>
<code>blah"</code>
<code>blah"</code>
<code>blah'</code>

Мой вопрос заключается в том, как добиться этого в одной replace функции, например:

s = s.replace(/(=|~)(('|")(.*?)|(.*?)('|"))\1/g, `<code>${$3 || $5}${$4 || $6}</code>`)
// extra line to push annoying scroll bar down

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

s = s.replace(/(=|~)(('|")(.*?)|(.*?)('|"))\1/g, `<code>$2</code>`)

Однако, так как вопрос наполовину закончен, и мне все еще интересно, как ссылаться на $3 or $5, строковый путь, а не обратный вызов.

Или я зашел в тупик.

1 Ответ

0 голосов
/ 02 января 2019

Группа захвата, которая не соответствует, при включении во второй обратный вызов к .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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...