【问题标题】:Recursive regex match递归正则表达式匹配
【发布时间】:2016-09-19 16:16:28
【问题描述】:

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

  • =>
  • 单词/字母

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

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

  • =>
  • 单词/字母
  • K(a,...)

... 匹配的位置

  • =>
  • 单词/字母
  • K(a,...)

等等……

我不确定这是否可能。

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

【问题讨论】:

  • Javascript 正则表达式不支持递归模式,最好按照您的建议编写解析器。
  • 你可以尝试使用xregexp.com库。
  • @Karpak 为什么 xregexp 会有帮助?
  • 这是 RegExp 扩展库。该库中的函数 XRegExp.matchRecursive 有助于进行递归正则表达式匹配。
  • @Jamgreen。请提供一些示例,其中至少包含 3 级递归示例字符串以及您想要的输出。 JS 不直接支持递归正则表达式,但是可以使用其他库来完成。如果您提供示例,那么只有 SO 应该能够为您提供建议。

标签: javascript regex recursion


【解决方案1】:

您可以使用以下正则表达式进行匹配。根据您在下面给出的示例,它会起作用。

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

【讨论】:

    【解决方案2】:

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

    它利用了所有) 都在末尾的事实。
    与 cmets 中的示例字符串一样。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多