regexp:指的是组的交替

时间:2019-01-02 01:42:06

标签: javascript regex

我要替换这样的字符串

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

此代码不适用于c。更具体地讲,如何指代...哦,天哪,我刚刚意识到我可以像下面这样介绍整个小组以满足我的要求

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

但是,由于问题已完成一半,我仍然对如何以字符串方式而不是回调方式引用$3 or $5感到好奇。

或者我陷入了僵局。

1 个答案:

答案 0 :(得分:1)

当未捕获的捕获组包含在.replace的第二个回调中时,将导致空字符串。因此,如果第3组和第5组是互斥的,并且您要引用第3组或第5组,则以匹配的任何一个为准,您可以只写$3$5-那是< em> not 匹配只会导致字符串为空(因此不会导致结果出现任何问题)。

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);