RegEx:如何在正则表达式与<delimiter>匹配之前捕获一行

时间:2016-08-28 02:34:57

标签: php regex

我举起这段文字:

II - title - XXXXXXXX
CNPJ: XXXXXXXXXX
test1: XXXXXXXXXX
Test1: XXXXXXXXXX

IIX - XXXXXXXX
CNPJ: XXXXXXXXXX
test2: XXXXXXXXXX
Test2: XXXXXXXXXX

我需要这个:

array(
0 => '
    II - title - XXXXXXXX
    CNPJ: XXXXXXXXXX
    test1: XXXXXXXXXX
    Test1: XXXXXXXXXX
',
1 => '
    IIX - XXXXXXXX
    CNPJ: XXXXXXXXXX
    test2: XXXXXXXXXX
    Test2: XXXXXXXXXX
',
 )

我用PHP代码填充这个正则表达式:

$regex = '~((?<delimiter>((.*\n{1}CNPJ)+).*?(?=(?&delimiter)|\Z)))~s';
preg_match_all($regex, $text, $matches);

单独的正则表达式工作:

(.*\n{1}CNPJ)

但当我加入&#39;分隔符&#39;它不起作用

'~((?<delimiter>((.*\n{1}CNPJ)+).*?(?=(?&delimiter)|\Z)))~s';

2 个答案:

答案 0 :(得分:1)

这里是一个刺(需要&#39; g&#39;修饰符):

([IX]* - ((.*) - )?(.*)\nCNPJ: (.*)\ntest[0-9]: (.*)\nTest[0-9]: (.*))+

不确定您希望在&#34; XXXXXX&#34;字段,所以我把它们留作(.*)。当然,你可以适应这些。

(。*)按顺序对应每个字段的标题和内容。

我不是真正的PHP家伙,但我希望这会有所帮助。

干杯,  圣保罗

PS:我同意John的观点 - 它可能更容易逐行处理。

更新:修正了表达式以删除不必要的&#39; X&#39;

<强> UPDATE2

如果要捕获CNPJ(或任何其他特定字段),可以使用命名捕获。对于CNPJ,那将是([IX]* - ((.*) - )?(.*)\nCNPJ: (?P<cnpj>.*)\ntest[0-9]: (.*)\nTest[0-9]: (.*))+

答案 1 :(得分:0)

看起来你没有在PHP的正则表达式引擎中使用适当的命名组语法。如果要创建命名组,则应使用(?[regex])。不幸的是,大多数正则表达式引擎允许你使用(?p = groupName)引用正则表达式中的命名组,但是目前php不支持它。相反,您必须按编号引用该组。