主要的JavaScript正则表达式大师需要递归过滤

时间:2013-06-16 15:03:32

标签: javascript regex recursion filter

我正在使用JavaScript正则表达式遇到严重问题。我想要的是“仅正则表达式”解决方案来执行这样的转换:

{{ users.name.find(50, "q")|lower }}  ---> lower(users.name.find(50, "q"))

我最终得到了以下分解,并且效果很好:

var m = '{{ users.name.find(50, "q")|lower }}';
var p = m.replace(/{{2}[ ]*([^{}, ]*[^{}]*[^{}, ]+)[ ]*}{2}/g, "$1");
console.log(p);    --->    users.name.find(50, "q")|lower

var k = p.replace(/(.+)(\|{1}(.*))+/g, "$3($1)");
console.log(k);    --->    lower(users.name.find(50, "q"))   --->  OK, it's fine.

但是现在,我希望它可以使用这样复杂的过滤:

var m = '{{ users.name.find(50, "q")|lower|filter(5, 9)|short|encode(true) }}';

我最终期待这样的事情:

console.log(
   m.replace(/MagicalRegexFromHell/g)
   .split(...).join(...)
   .replace(/GuruRegex2/g, 'recursive thing that does not exists $n($n-1)')
   .replace('/OkItsDone/g')
)

---->  encode(short(filter(lower(users.name.find(50, "q")), 5, 9)), true)

我花了好几个小时,所以如果有人只有一个使用split()/ replace()/ regex和join()的解决方案,那就太酷了,因为我无法在代码中使用分支语句实现(就是这样:没有开关,没有等等......)

谢谢。

1 个答案:

答案 0 :(得分:0)

你可以这样做:

// var p comes from your code
var r = p.split(/|/).reduce(function(txt, f) {
    var par = (f.indexOf("(") + 1) || f.length;
    return f.substring(0, par)
        + (par == f.length ? "(" : "")
        + txt
        + (par == f.length ? ")" : ", ") + f.substring(par);
});

我不认为你可以在没有循环的情况下递归地应用正则表达式。