我要替换这样的字符串
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
感到好奇。
或者我陷入了僵局。
答案 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);