两个匹配项的正则表达式组结果

Regex group findings of two matches

我不太喜欢正则表达式,但这次我认为没有办法做我想做的事。请查看我的真实实时测试示例:(BEGIN @\d+\b.*?ACTION_READLN ~.+?~) 考虑这样的原始文本数据:

BEGIN @1011 Text
Text
    ACTION_READLN ~variableName~
Text
END
BEGIN @1012
asdasd
    ACTION_READLN ~someothervariable~
END
BEGIN @1013

asd
END

我能够创建找到 "BEGIN @(only numbers)" 和 "ACTION_READLN ~*~"

的正则表达式
BEGIN @\d+|(ACTION_READLN.~.+~)

现在,我想将首次出现的 BEGIN 与首次出现的 ACTION_READLN 组合在一起。我该怎么做?

编辑:预期结果:

Group1:
BEGIN @1011
ACTION_READLN ~variableName~

Group2:
BEGIN @1012
ACTION_READLN ~someothervariable~

仅在点之间使用 s 标志来消耗换行符。 Groups 将捕获需要的东西。

$re = '/(BEGIN @\d+)\b(?s:.*?)(ACTION_READLN.*)/';

See demo at regex101. With preg_match_all 如果需要,使用 PREG_SET_ORDER 设置输出模式。

preg_match_all($re, $str, $out, PREG_SET_ORDER);

每个 $out 中捕获的匹配项将是元素 [1][2][0] 完全匹配。 Try at eval.in