重复捕获组 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+ 个单词字符。
不明白为什么这个正则表达式 (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+ 个单词字符。