匹配同一行中的多个模式

时间:2016-10-03 20:07:01

标签: javascript regex

我有类似

的东西
var string = "<h1>Hi {{name|there}}</h1>
<p>This is a message<br>
</p>
<p>Hello hello</p>"

我想查找所有{{...}}标记,并将其替换为第一个属性(|的左侧)和相应的值。如果该值不存在,我想用右侧的'fallback'替换标签(在这种情况下,字符串'there')

到目前为止,我已经尝试了类似下面的内容,但它没有得到群组

/{{(.+)|(.+)}}/

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

你可以这样做:

&#13;
&#13;
var string = "<h1>Hi {{name|there}}</h1> <p>This is a message<br></p><p>Hello hello</p>";

// If the variable exists
console.log(parse(string, {name: "Tony"}));

// If the variable is not set
console.log(parse(string, {potato: "Tony"}));

function parse(str, values){
  str = str.replace(/\{\{(.*)\|(.*)\}\}/g,function(arg, match1, match2){
    var data = match1.split("|");
    var variable = match1;
    var fallback = match2;
    var replace = fallback;

    if(typeof(values[variable]) != "undefined"){
      replace = values[variable];
    }
    return replace;
  });
  return str;
}
&#13;
&#13;
&#13;

答案 1 :(得分:1)

如果您的输入看起来像{{name|there}}(=&gt; name),或{{|there}}(=&gt; there)或{{there}}(=&gt; ; there),您可以使用以下方法:

&#13;
&#13;
var string = `<h1>Hi {{name|there}}</h1>
<p>This is a {{|message}}<br>
</p>
<p>Hello {{hello}}</p>`;
var rx = /{{(.*?)(?:\|(.*?))?}}/g;
console.log(string.replace(rx, function(m,g1,g2) {
  return g1 ? g1 : g2;
}));
&#13;
&#13;
&#13;

详细

  • {{ - 文字{{文字
  • (.*?) - 第1组捕获除了换行符号以外的任何0 +字符,直到第一个
  • (?:\|(.*?))? - 可选序列
    • \| - 文字|
    • (.*?) - 第2组捕获除了换行符号以外的任何0 +字符,直到第一个
  • }} - 文字}}文字。

在替换中,首先检查组1,如果它不为空,则返回其内容。否则,返回第2组内容。

答案 2 :(得分:1)

您可以执行以下操作;

&#13;
&#13;
var str = "<h1>Hi {{name|there}}</h1>",
   val1 = "muçaços",
   val2 = undefined,
   str1 = str.replace(/\{\{(\w+)\|(\w+)\}\}/,(m,p1,p2) => val1||p2),
   str2 = str.replace(/\{\{(\w+)\|(\w+)\}\}/,(m,p1,p2) => val2||p2);
console.log(str1);
console.log(str2);
&#13;
&#13;
&#13;

答案 3 :(得分:0)

你应该逃避所有这些角色:{} |

string.match(/\{\{(.+)\|(.+)\}\}/)