正则表达式手柄

Regex Handle Bars

本文关键字:正则表达式      更新时间:2023-09-26

>我有这样的字符串

"{{hello}}{{{how}}}{{are}}{{{you}}}"

我需要编写一个正则表达式来仅替换匹配项

2 braces followed by anything except {}, ends with }}
{{hello}} is valid
{{{how}}} is not. Because it has 3 braces

我尝试[^{}]*{{[^{}]+}}[^{}]*但似乎不起作用。

有没有办法只获得带有 2 个大括号的匹配项。


例如,如果我想用空字符串替换匹配项。

"{{hello}}{{{how}}{{are}}{{{you}}}"

应该成为

"{{{how}}}{{{you}}}"

alert("{{hello}}{{{how}}}{{are}}{{{you}}}".replace(/(^|[^{])'{'{[^{}]*'}'}(?!'})/g, "$1"))

上面的正则表达式应该与正好由两个大括号包围的字符串匹配。

  • (^|[^{])应捕获行首或任何字符,但不能捕获大括号的开头。
  • '{'{[^{}]*'}'}匹配一个双卷曲支撑块,看起来像{{foo}}{{bar foo bar}}
  • (?!'}) 负面展望,断言比赛后不会有结束大括号。

正则表达式演示

您可以使用

/('B|[^{]){{[^{}]*}}(?!})/g

并替换为 $1 ,请参阅此正则表达式演示。

这里的要点是,如果字符串中间的{{...}}前面有非单词字符/字符串开头('B)或不是{字符([^{]),则应匹配。否则,将找不到连续的匹配项。

JS演示:

var re = /('B|[^{]){{[^{}]*}}(?!})/g; 
var str = '{{hello}}{{{how}}}{{are}}{{{you}}}'n{{{hello}}}{{how}}{{are}}{{{you}}}';
document.body.innerHTML += "----- Input ------<br/>" + str.replace(/'n/g, "<br/>");
var result = str.replace(re, '$1');
document.body.innerHTML += "<br/>----- Result ------<br/>" + result.replace(/'n/g, "<br/>");

更新

这是模仿负面回溯的另一种选择:

var str = '{{hello}}{{{how}}}{{are}}{{{you}}}'n{{{hello}}}{{how}}{{are}}{{{you}}}';
var output = str.replace(/({)?{{[^{}]*}}(?!})/g, function($0, $1){
	return $1 ? $0 : 'x';
});
document.body.innerHTML = output.replace(/'n/g, "<br/>");

如果在{{它被捕获到组 1 和回调中之前有一个{,我们会检查它是否匹配。如果是,只需将整个匹配项放回原处,否则,仅替换找到的匹配项。