我想在两个已知的子字符串(<foo>和</foo>)之间删除一个未知的子字符串。例如,我希望将以下内容转换为:
hello <foo>remove me</foo>
to:
hello <foo></foo>
我可以用以下方式实现:
s = ...
s.replace(/<foo>.*?<\/foo>/, '<foo></foo>')
但我想知道是否有一种方法可以在正则表达式和替换文本中不重复使用已知的子字符串(<foo>
和</foo>
)来完成这个操作。
我想在两个已知的子字符串(<foo>和</foo>)之间删除一个未知的子字符串。例如,我希望将以下内容转换为:
hello <foo>remove me</foo>
to:
hello <foo></foo>
我可以用以下方式实现:
s = ...
s.replace(/<foo>.*?<\/foo>/, '<foo></foo>')
但我想知道是否有一种方法可以在正则表达式和替换文本中不重复使用已知的子字符串(<foo>
和</foo>
)来完成这个操作。
你可以在一个匹配组
中捕获标签,并且稍后将其作为反向引用使用:
var repl = s.replace(/<(foo)>.*?<\/\1>/, '<$1></$1>');
//=> hello <foo></foo>
注意,\1
和$1
是对捕获组#1的反向引用。
尝试使用分组的正则表达式。
(?:<foo>)(.*?<\/foo>)
图片表示:Debuggex演示
示例代码:
var re = /(?:<foo>)(.*?<\/foo>)/;
var str = 'hello <foo>remove me</foo>';
var subst = '<foo></foo>';
var result = str.replace(re, subst);
输出:
hello <foo></foo>
"<foo>abcdefg</foo><foo>hijklmno</foo>"
时,它将匹配整个字符串而不是<foo>abcdefg</foo>
,因为量词*
是贪婪的。关于regex101步骤(或regexbuddy步骤):查看需要多少步骤才能使您的模式成功或失败是有用的。但请记住,这些信息并不总是与实际的模式性能相关。确定的方法是使用计时器。 - Casimir et Hippolyte
<foo><a>...</a></foo>
这种格式,它能正常工作吗? - Braj