更新/注意:
我想我可能正在寻找的是得到捕获一组 https://stackoverflow.com/questions/6571106/can-you-retrieve-multiple-regex-matches-in-javascript/6571139#6571139 in PHP.
参考:使用命名模式子例程的 PCRE 正则表达式。 https://stackoverflow.com/questions/4941259/pcre-regular-expressions-using-named-pattern-subroutines
(仔细读:)
我有一个包含可变数量段的字符串(简化):
$subject = 'AA BB DD '; // could be 'AA BB DD CC EE ' as well
我现在想匹配这些段并通过 matches 数组返回它们:
$pattern = '/^(([a-z]+) )+$/i';
$result = preg_match_all($pattern, $subject, $matches);
这只会返回last捕获组 2 的匹配:DD
.
有没有一种方法可以检索所有子模式捕获(AA
, BB
, DD
)用一个正则表达式执行?不是preg_match_all
适合这个吗?
这个问题是一个概括。
这俩$subject
and $pattern
被简化。自然地有了这样的一般清单AA
, BB
, .. 使用其他函数(例如explode
)或与$pattern
.
但我特别询问如何返回所有子组匹配preg_...
- 函数族。
对于现实生活中的情况,假设您有多个(嵌套)级别的不同数量的子模式匹配。
Example
这是一个伪代码示例,用于描述一些背景知识。Imagine下列:
令牌的常规定义:
CHARS := [a-z]+
PUNCT := [.,!?]
WS := [ ]
$subject
get 基于这些进行标记化。标记化存储在标记数组中(类型、偏移量……)。
然后该数组被转换为一个字符串,每个标记包含一个字符:
CHARS -> "c"
PUNCT -> "p"
WS -> "s"
因此,现在可以在令牌流字符串索引上运行基于令牌(而不是字符类等)的正则表达式。例如。
regex: (cs)?cp
表达一组或多组字符,后跟标点符号。
由于我现在可以将自定义标记表示为正则表达式,因此下一步是构建语法。这只是一个例子,这是 ABNF 风格:
words = word | (word space)+ word
word = CHARS+
space = WS
punctuation = PUNCT
如果我现在编译语法words进入(令牌)正则表达式我希望自然地拥有每个的所有子组匹配word.
words = (CHARS+) | ( (CHARS+) WS )+ (CHARS+) # words resolved to tokens
words = (c+)|((c+)s)+c+ # words resolved to regex
到目前为止我可以编码。然后我遇到了一个问题,小组比赛只包含他们的最后一场比赛。
因此,我可以选择自己为语法创建一个自动机(我想阻止它以保持语法表达式通用),或者以某种方式让 preg_match 为我工作,这样我就可以省掉它。
基本上就是这样。也许现在可以理解为什么我简化了问题。
Related:
- pcrepattern 手册页 http://regexkit.sourceforge.net/Documentation/pcre/pcrepattern.html
- 使用 preg_match_all() 获取重复匹配 https://stackoverflow.com/questions/6579908/get-repeated-matches-with-preg-match-all