I\'m using Mustache-style tags inside of AngularJS. What\'s the best regex to use to return an array of just the text inside the mustache braces?
Sample dat
String.prototype.supplant
This will interpolate any {param}
you have between handleBars ({}
). I know this answer is somewhat extensive, but I assumed the question was probably regarding interpolation -- either way, I'd advise the reader to study the regex, regardless.
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);
Hope this helps
If you use a global search with .match
, JavaScript won't give the capture groups in its array output. As such, you need to do it twice: Once to find the {{...}}
pairs, then again to extract the names from within them:
str.match(/{{\s*[\w\.]+\s*}}/g)
.map(function(x) { return x.match(/[\w\.]+/)[0]; });
I really liked the answer @Cody provided, but ran into a scope issue if you wanted to make the object you pass more of a real object and not just a list, so I found an eval trick to change the scope so I thought I would share it.
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)
You could try doing this with exec()
instead:
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]);
Something like this
/{{\s?([^}]*)\s?}}/
The values would be in first group (you know, not the 0-group, the 1-group :))
One more point - this regex is captures everything between {{
and }}
, so all the punctuation marks, braces, dots, etc. If you need only words (possibly separated by underscore or whitespace) this would be more useful for you:
/{{\s?[\w\s]*\s?}}/