0

我在使用 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() 的解决方案,那会很酷,因为我无法在我的代码实现中使用分支语句(那是它:没有开关,没有 if 等......)

谢谢你。

4

1 回答 1

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);
});

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

于 2013-06-16T15:48:33.273 回答