匹配大括号之间的特定部分

时间:2018-01-18 10:59:50

标签: javascript regex

我有以下示例字符串。

  

您好{{ bob .name}} bob.name {{john.name}}

我突出了我想要匹配的部分。 它必须在每一端的两个花括号之间,它必须是点之前的第一个单词。

我试过这个正则表达式[^{{}}]+(?=\}}),但它匹配大括号之间的所有内容,如此

  

您好{{ bob.name }} bob.name {{ john.name }}

如果我能提供一个要查找其名称的变量,那也是非常好的。

3 个答案:

答案 0 :(得分:2)

您可以将此正则表达式与否定字符类,前瞻和捕获组一起使用:

/{{([^}.]+)(?=(?:(?!}}).)*}})/

RegEx Demo

  • ([^}.]+)[^}.]+匹配不是点而非}的字符。 (...)在第1组中捕获。
  • (?=(?:(?!}}).)*}})是一个先行者,声称我们前面有}}

要替换bob内的{{...}},请使用:

repl = str.replace(/({{)bob(?=(?:(?!}}).)*}})/gi, '$1newVal'); 

要匹配bob内的{{...}},请使用:

{{bob(?=(?:(?!}}).)*}})

答案 1 :(得分:1)

您可以使用{{([^.]*)[^}]*}}而不需要任何预测。

Regex101 Demo

{{ }}确保您在双括号内。

([^.]*)捕获除点之外的每个字符。

[^}]*与双括号内的其他内容相匹配。

第一个回归组就是你想要的。

答案 2 :(得分:0)

使用

(?<={{)([^{}]+?)(?=(?:\.(.*))?}})

它只匹配 bob 并有2个匹配的组:第一个 - bob 和第二个 - 名称

您可以像这样使用它(使用ES6语法):

const str = 'Hello {{bob.name}} bob.name {{john.name}}';
str.replace(/(?<={{)([^{}]+?)(?=(?:\.(.*))?}})/g, (allMatch, person, property) => {
  console.log(`All match = ${allMatch}, person = ${person}, property = ${property}`);
}));