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は配列出力でキャプチャグループを提供しません。そのため、2回実行する必要があります。1回は{{...}}ペアを見つけ、次にもう一度ペアを抽出します。

str.match(/{{\s*[\w\.]+\s*}}/g)
   .map(function(x) { return x.match(/[\w\.]+/)[0]; });
于 2013-03-19T14:56:45.560 に答える
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 グループです :))

もう 1 つのポイント - この正規表現はとの間のすべてをキャプチャするため、すべての句読点、中括弧、ドットなどをキャプチャします。単語のみが必要な場合 (アンダースコアまたは空白で区切られている可能性があります)、これはより便利です:{{}}

/{{\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 に答える