【问题标题】:Repeated capturing group PCRE重复捕获组 PCRE
【发布时间】:2017-05-25 18:32:22
【问题描述】:

不明白为什么这个正则表达式 (regex101)

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

捕获所有输入,而 this (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 表示“重复捕获组将仅捕获最后一次迭代。在重复组周围放置一个捕获组以捕获所有迭代......”。我已尝试遵循此提示,但对我没有帮助。

【问题讨论】:

标签: regex pcre capturing-group


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

【讨论】:

  • 我尝试将第二个正则表达式作为参数传递给preg_match_all ,这正是我所需要的。同样匹配第一个正则表达式和解析父捕获似乎更清晰,但它至少需要+1 preg_match,所以我会选择第二个选项。感谢您的精彩解释!
  • 是的,只是在获得此操作所需的评分时对您的答案进行了投票 :) 几个小时前,我还没有足够的评分来投票
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2015-04-03
相关资源
最近更新 更多