重复捕获组PCRE

时间:2017-01-11 04:47:04

标签: regex pcre capturing-group

无法理解为什么这个正则表达式(regex101

/[\|]?([a-z0-9A-Z]+)(?:[\(]?[,][\)]?)?[\|]?/g

捕获所有输入,而这(regex101

/[\|]+([a-z0-9A-Z]+)(?:[\(]?[,][\)]?)?[\|]?/g

仅捕获|Func

输入字符串为|Func(param1, param2, param32, param54, param293, par13am, param)|

另外,我如何以正常方式匹配重复捕获组?例如。我有正则表达式

/\(\(\s*([a-z\_]+){1}(?:\s+\,\s+(\d+)*)*\s*\)\)/gui

输入字符串为(( string , 1 , 2 ))

Regex101说“重复捕获组只捕获最后一次迭代。在重复组周围放置一个捕获组来捕获所有迭代......”。我试图按照这个提示,但它没有帮助我。

1 个答案:

答案 0 :(得分:1)

您的/[\|]+([a-z0-9A-Z]+)(?:[\(]?[,][\)]?)?[\|]?/g正则表达式不匹配,因为您没有定义与括号内的单词匹配的模式。您可以将其修改为\|+([a-z0-9A-Z]+)(?:\(?(\w+(?:\s*,\s*\w+)*)\)?)?\|?,但括号内的所有值都将匹配到一个您必须稍后拆分的单个组中。

使用PCRE正则表达式无法获得任意数量的捕获,因为在重复捕获的情况下,只有最后捕获的值存储在组缓冲区中。

你可能会做的是获取与preg_match_all捕获初始分隔符的多重匹配。

因此,要匹配第二个字符串,您可以使用

(?:\G(?!\A)\s*,\s*|\|+([a-z0-9A-Z]+)\()\K\w+

请参阅the regex demo

<强>详情:

  • (?:\G(?!\A)\s*,\s*|\|+([a-z0-9A-Z]+)\() - 上一场比赛的结尾(\G(?!\A))和一个用0 +空格(\s*,\s*)或1 + |符号括起来的逗号({ {1}}),后跟1个以上的字母数字字符(捕获到第1组,\|+)和([a-z0-9A-Z]+)符号((
  • \( - 省略目前为止匹配的文字
  • \K - 1 + word chars。