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']
Ответы
Ответ 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)