重复捕获组 PCRE

Repeated capturing group PCRE

不明白为什么这个正则表达式 (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 表示 "a repeated capturing group will only capture the last iteration. Put a capturing group around the repeated group to capture all iterations..."。我已尝试遵循此提示,但对我没有帮助。

您的 /[\|]+([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 组,([a-z0-9A-Z]+))和一个 ( 符号 (\()
  • \K - 省略目前匹配的文本
  • \w+ - 1+ 个单词字符。