我不是正则表达的忠实粉丝,但这次我认为没有办法做我想要的。请通过真实的实时测试查看我的示例:(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 @(仅限数字)”和“ACTION_READLN〜*〜”
BEGIN @\d+|(ACTION_READLN.~.+~)
现在,我希望在第一次出现ACTION_READLN时将第一次出现的BEGIN分组。我怎么能这样做?
编辑:预期结果:
Group1:
BEGIN @1011
ACTION_READLN ~variableName~
Group2:
BEGIN @1012
ACTION_READLN ~someothervariable~
答案 0 :(得分:1)
仅在点之间使用s
标记来消耗换行符。 Groups将捕获所需的内容。
$re = '/(BEGIN @\d+)\b(?s:.*?)(ACTION_READLN.*)/';
See demo at regex101。如果需要,preg_match_all使用PREG_SET_ORDER
设置输出模式。
preg_match_all($re, $str, $out, PREG_SET_ORDER);
每个$out
中的捕获匹配将是元素[1]
和[2]
。 [0]
完全匹配。 Try at eval.in