递归正则表达式匹配

时间:2016-09-19 16:16:28

标签: javascript regex recursion

我使用/<?=>|[^\s\w]|\w+/g来匹配

  • &LT; =&GT;
  • =&GT;
  • 字/字母

但我也希望匹配K(a,...) a可以是任何字/字母,...可以是此最终正则表达式中匹配的任何内容。所以它实际上必须是递归的。

所以新的正则表达式应该匹配

  • &LT; =&GT;
  • =&GT;
  • 字/字母
  • K(A,...)

...匹配

  • &LT; =&GT;
  • =&GT;
  • 字/字母
  • K(A,...)

依旧......

我不确定这是否可行。

我不确定是否可以更容易地创建一个递归遍历字符串中每个字符的函数,类似于https://en.wikipedia.org/wiki/Recursive_descent_parser

2 个答案:

答案 0 :(得分:0)

您可以使用以下正则表达式进行匹配。基于您给出的示例,下面的内容可行。

/(K\(.+,(.+)\)|<?=>)|\w+\1/g

答案 1 :(得分:0)

下面的javascript中使用的正则表达式不使用递归 因为这在标准的javascript正则表达式中不可用。

它充分利用了所有)都在最后的事实 与评论中的示例字符串一样。

var str = "ps<=>q=>pb=>K(ab,K(b,K(c,p => q)))  not)";

var re = /\w+(?:\([^()]+)+[)]+|<?=>|\w+(?=<?=>)/g;

var matchArray = [];
var m;

while (m = re.exec(str)) {
    matchArray.push(m[0]);
}

console.log(matchArray);