30

我在 AngularJS 中使用 Mustache 样式的标签。什么是最好的正则表达式来返回一个包含小胡子括号内的文本的数组?

样本数据:

"This could {{be }} a {{ string.with.dots_and_underscores }} of {{ mustache_style}} words which {{could}} be pulled."

预期输出:

['be','string.with.dots_and_underscores','mustache_style','could']
4

5 回答 5

33

如果您使用全局搜索.match,JavaScript 将不会在其数组输出中提供捕获组。因此,您需要执行两次:一次查找{{...}}对,然后再次从其中提取名称:

str.match(/{{\s*[\w\.]+\s*}}/g)
   .map(function(x) { return x.match(/[\w\.]+/)[0]; });
于 2013-03-19T14:56:45.560 回答
13

道格拉斯·克罗克福德的ModString.prototype.supplant

这将{param}在 handleBars ( {}) 之间插入您拥有的任何内容。我知道这个答案有点广泛,但我认为问题可能与插值有关——无论哪种方式,我都建议读者研究正则表达式,无论如何。

clear();

function interpolate(str) {
    return function interpolate(o) {
        return str.replace(/{([^{}]*)}/g, function (a, b) {
            var r = o[b];
            return typeof r === 'string' || typeof r === 'number' ? r : a;
        });
    }
}

var terped = interpolate('The {speed} {color} fox jumped over the lazy {mammal}')({
    speed: 'quick',
    color: 'brown',
    mammal: 'dog'
});

console.log(terped);

希望这可以帮助

于 2015-08-05T17:53:11.473 回答
8

您可以尝试这样做exec()

var list = [],
    x = '"This could {{be }} a {{ string }} of {{ mustache_style}} words which {{could}} be pulled."',
    re = /{{\s*([^}]+)\s*}}/g,
    item;

while (item = re.exec(x))
    list.push(item[1]);
于 2013-03-19T15:00:22.757 回答
5

像这样的东西

/{{\s?([^}]*)\s?}}/

这些值将在第一组中(您知道,不是 0 组,而是 1 组 :))

还有一点 - 这个正则表达式捕获{{and之间的所有内容}},因此所有的标点符号、大括号、点等。如果您只需要单词(可能由下划线或空格分隔),这对您更有用:

/{{\s?[\w\s]*\s?}}/
于 2013-03-19T14:49:01.690 回答
3

我真的很喜欢@Cody 提供的答案,但是如果您想让对象传递更多的是真实对象而不仅仅是列表,则会遇到范围问题,所以我找到了一个 eval 技巧来更改范围,所以我想我会分享它。

function interpolate(str) {
    return function interpolate(o) {
        return str.replace(/{([^{}]*)}/g, function (a, b) {
            let r
            with(o){
              r = eval(b)
            }
            return r
        });
    }
}

var terped = interpolate('The {speed} {fox.color} {mammal[2]} jumped over the lazy {mammal[0]}')({
    speed: 'quick',
    fox: {
      color: 'brown'
    },
    mammal: ['dog', 'cat', 'fox']
});

console.log(terped)
于 2017-01-26T22:07:17.030 回答