更新/注意事项:
I think what I’m probably looking for is to get the 07000 in PHP.
(仔细读:)
我有一个包含可变数量段的字符串(简化):
$subject = 'AA BB DD '; // could be 'AA BB DD CC EE ' as well
我现在想要匹配分段,并通过匹配数组返回它们:
$pattern = '/^(([a-z]+) )+$/i';
$result = preg_match_all($pattern, $subject, $matches);
这将只返回捕获组2:DD的最后一个匹配。
有没有办法可以用一个正则表达式执行检索所有子模式捕获(AA,BB,DD)?是不是preg_match_all适合这个?
这个问题是一个泛化。
$主题和$模式都被简化。自然地,与AA,BB,..的一般列表更容易提取与其他功能(例如爆炸)或$模式的变化。
但是我具体询问如何使用preg _…-系列函数返回所有的子组匹配。
对于一个现实生活中的情况,想象你有多个(嵌套)级别的变化量的子模式匹配。
例
这是伪代码中的一个例子,用于描述一点背景。想像一下:
令牌的定期定义:
CHARS := [a-z]+
PUNCT := [.,!?]
WS := [ ]
$ subject获得根据这些标记。令牌化存储在令牌数组(类型,偏移量,…)内。
然后将该数组转换为一个字符串,每个令牌包含一个字符:
CHARS -> "c"
PUNCT -> "p"
WS -> "s"
因此,现在可以在令牌流字符串索引上基于令牌(而不是字符类等)运行正则表达式。例如。
regex: (cs)?cp
表达一个或多个字符,然后是标点符号。
因为我现在可以将自定义令牌表示为正则表达式,下一步是构建语法。这只是一个例子,这是一种ABNF风格:
words = word | (word space)+ word
word = CHARS+
space = WS
punctuation = PUNCT
如果我现在将语法的语法编译成(令牌)正则表达式,我想自然地将每个单词的所有子组匹配。
words = (CHARS+) | ( (CHARS+) WS )+ (CHARS+) # words resolved to tokens
words = (c+)|((c+)s)+c+ # words resolved to regex
我可以编码直到这一点。然后,我遇到了子组匹配的问题,只包含最后一场比赛。
所以我可以选择为自己创建一个自动机的语法(我想阻止语法表达式通用),或者有些让preg_match为我工作,所以我可以这样做。
基本上都是这样可能现在可以理解为什么我简化了这个问题。
有关: