所有`{{`的负向后方,而不以`<em>`结尾

时间:2018-07-27 13:19:42

标签: javascript regex

给出一个字符串,例如

The quick brown {{ fox }} jumped over the lazy <em>{{ dog }}</em>

我正在寻找一种模式,该模式将匹配{{块之前的<em> not 的所有实例

虽然模式/(?<!>)\{{2}/gm可以使用,但是对于Firefox和IE风格的JS,这不是一个选择。

我已经做了相当多的挖掘工作,并且可以找到大量的例子,这些例子几乎可以实现,但还不完全到此。对字符串_>{{_进行正匹配是没有问题的,但这与我正在寻找的相反。

我觉得我可能会采用这种查找方法,朝错误的方向前进。我在这里想念更简单的东西吗?

3 个答案:

答案 0 :(得分:0)

我猜您想访问{{ }}内的内容并将其包装在<em>标签中。

您可以使用RegEx ([^>]){{(.*?)}}

并替换为$1<em>$2</em>

  • ([^>])确保前面的字符不是>

  • {{(.*?)}}{{ }}内的任何内容匹配

Demo.

答案 1 :(得分:0)

您可以使用<em>正则表达式来匹配任何<em>[\s\S]*?<\/em>内容,然后在所有其他上下文中将{{...}}子字符串与{{[\s\S]*?}}模式进行匹配,捕获它们之一并使用自定义逻辑在回调方法中:

console.log(
  "The quick brown {{ fox }} jumped over the lazy <em>{{ dog }}</em>"
          .replace(/<em>[\s\S]*?<\/em>|({{[\s\S]*?}})/g, function ($0,$1) {
                 return $1 ? '<em>' + $1 + '</em>' : $0;
            })
);

使用$1 ?,我们检查第1组是否匹配,如果是,则用<em>标签包裹该值,否则,将其粘贴回$0(整个匹配项) )。

答案 2 :(得分:0)

您可以改用结束标记:/{{[^}]*?}}(?!<\/em>)/g

let test = "The quick brown {{ fox }} jumped over the lazy <em>{{ dog }}</em> asdfafds {{ fox }} asdf asdf asdf sdfasdfsdf <em>{{ dog }}</em>";
console.log("input: " + test);
console.log("output: " + test.replace(/({{[^}]*?}})(?!<\/em>)/g, "<em>$1</em>"));