Regex for mustache-style double braces?

前端 未结 5 988
后悔当初
后悔当初 2020-12-24 06:51

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

相关标签:
5条回答
  • 2020-12-24 07:06

    Mod of Douglas Crockford's 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

    0 讨论(0)
  • 2020-12-24 07:07

    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]; });
    
    0 讨论(0)
  • 2020-12-24 07:10

    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)
    
    0 讨论(0)
  • 2020-12-24 07:20

    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]);
    
    0 讨论(0)
  • 2020-12-24 07:26

    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?}}/
    
    0 讨论(0)
提交回复
热议问题