Подтвердить что ты не робот

Regex для двойных фигурных скобок в стиле усов?

Я использую теги стиля Mustache внутри AngularJS. Какое лучшее регулярное выражение используется для возврата массива только текста внутри скобок усов?

Пример данных:

"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']
4b9b3361

Ответ 1

Если вы используете глобальный поиск с .match, JavaScript не даст группам захвата в своем массиве. Таким образом, вам нужно сделать это дважды: как только найти пары {{...}}, затем снова извлечь имена из них:

str.match(/{{\s*[\w\.]+\s*}}/g)
   .map(function(x) { return x.match(/[\w\.]+/)[0]; });

Ответ 2

Мод Дугласа Крокфорда String.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);

Надеюсь, что это поможет

Ответ 3

Вместо этого вы можете попробовать 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]);

Ответ 4

Что-то вроде этого

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

Значения будут в первой группе (вы знаете, а не 0-группа, 1-группа:))

Еще один момент - это регулярное выражение захватывает все между {{ и }}, поэтому все знаки препинания, фигурные скобки, точки и т.д. Если вам нужны только слова (возможно, разделенные символом подчеркивания или пробела), это будет больше Полезно для вас:

/{{\s?[\w\s]*\s?}}/

Ответ 5

Мне очень понравился ответ @Cody, но он попал в проблему с областью, если вы хотите сделать объект, в котором вы передаете больше реального объекта, а не только список, поэтому я нашел уловку для изменения области, поэтому я думал, что поделюсь им.

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)