Regex:不;t在某些情况下有效

Regex: Doesn't works in some cases

本文关键字:情况下 有效 Regex      更新时间:2023-09-26

我真的是regex的新手,并且一直在练习

$(".app").each(function(){
    var raw_string = $(this).html();
    var changed_string = raw_string.replace(/^'{'{|'}'}$/g, "");
    $(this).html(eval(changed_string));
});

我正在尝试查看.app的HTML,并搜索以胡子{{开始、以胡子}}结束的任何内容。就像Mustache.js一样。首先,我用一个空字符串替换它,然后将.app的HTML设置为eval(changed_string)。所以如果我尝试:

<div class="app">
    {{2+2}}
</div>

工作绝对精细的印刷4。但是:

问题

如果我在.app:中添加一些额外的HTML

<div class="app">
    2 and 2 are: {{2+2}}
</div>

输出为:

2 and 2 are: {{2+2}}

发生了什么事

Js投标演示

修复表达式(匹配字符串的开头/结尾)仍然无法解决问题;您将尝试评估整个字符串,包括"2和2是:…"。

试试这个,替换每个{{...}}对中的东西:

$(".app").each(function(){
    var raw_string = $(this).html();
    var changed_string = raw_string.replace(/'{'{(.+)'}'}/g, 
      function( match, p1 ) {
        return(eval(p1));
      }                                     
    );
    $(this).html(changed_string);
});

问题是你的.replace(…)并没有捕捉到胡子之间的东西,它只是去除了胡子。因此,在第二种情况下,您将尝试评估字符串而不是有效表达式,即eval("2 and 2 are: 2+2");

修复方法是使用捕获组()执行.exec或.match,并提取捕获的字符串进行eval。

    $(".app").each(function(){
        var raw_string = $(this).html();
        var reg = new RegExp(/'{'{(.*)'}'}/);
        var formula = reg.exec(raw_string); // captures orig string in formula[0], first match in formula[1]
        $(this).html(eval(formula[1]));
    });