匹配字符不是由括号递归括起来的

时间:2018-01-10 14:22:54

标签: regex pcre

我试图在管道上拆分一个字符串,当它们没有用括号括起来时。

我有一个有效的正则表达式,除非有递归括号:

~\([^)]*\)(*SKIP)(*F)|\|~

test(test(test|tester)|test)|test
                      ^ and ^ are matched, only last one should match

regex101 link to play around

1 个答案:

答案 0 :(得分:2)

您可以根据子程序使用以下正则表达式:

(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|\|

请参阅regex demo

<强>详情

  • (\((?:[^()]++|(?1))*\)) - 匹配的第1组
    • \( - (
    • (?:[^()]++|(?1))* - 出现0次或以上:
      • [^()]++ - ()以外的任何1个字符
      • | - 或
      • (?1) - 整个第1组模式被递归(注意(?R)在这里不起作用,因为它会递归整个正则表达式模式)
    • \) - )字符
  • (*SKIP)(*F) - PCRE动词序列,省略当前匹配的文本并使正则表达式引擎搜索从当前匹配结束开始的下一场比赛
  • | - 或
  • \| - 文字|