我正在使用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()的解决方案,那就太酷了,因为我无法在代码中使用分支语句实现(就是这样:没有开关,没有等等......)
谢谢。
答案 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);
});
我不认为你可以在没有循环的情况下递归地应用正则表达式。