无法理解为什么这个正则表达式(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说“重复捕获组只捕获最后一次迭代。在重复组周围放置一个捕获组来捕获所有迭代......”。我试图按照这个提示,但它没有帮助我。
答案 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。