具有多个捕获组的正则表达式

时间:2011-05-08 01:03:27

标签: php regex

我一直在使用正则表达式来挑选一些我需要解析到数据库中的文本文件。我的文件格式如下:

Lorem ipsum dolor         sit amet, consectetur adipiscing elit.

Fusce lacinia sollicitudin lectus id eleifend. Phasellus.

massa sapien, scelerisque in tincidunt et, porttitor eget ante.
In iaculis justo vel quam rhoncus volutpat. Curabitur eros est,
ultrices in elementum eget, venenatis eget mauris. Sed sollicitudin,
nibh sed varius aliquet, neque odio porttitor risus, at sollicitudin

lectus neque sit amet diam.
Aliquam condimentum sapien eu
tellus condimentum suscipit.
Pellentesque in accumsan nunc.

我正在努力想出以下捕获组:

  • Lorem ipsum dolor
  • sit amet, consectetur adipiscing elit.
  • Fusce lacinia sollicitudin lectus id eleifend. Phasellus.
  • massa sapien, scelerisque in tincidunt et, porttitor eget ante.
    In iaculis justo vel quam rhoncus volutpat. Curabitur eros est, ultrices in elementum eget, venenatis eget mauris. Sed sollicitudin, nibh sed varius aliquet, neque odio porttitor risus, at sollicitudin

备注: 多行段落后的所有内容都可以忽略。所有组都可以包括字母,数字,空格和标点符号。我将使用PHP对文本进行一些额外的后处理。

我最后一次尝试捕获前两个部分,这比我的其他尝试更接近但仍未按预期工作:

^((?:[a-zA-Z0-9!-~](?: (?! ))?)+?)(?: {2,})((?:[a-zA-Z0-9!-~](?: (?! ))?)+?)

我认为这将从文件的开头开始,将所有内容捕获到遇到多个空格的位置,然后抓住剩下的行。

1 个答案:

答案 0 :(得分:1)

试试这个:

$pattern='~\A(.+?) {2,}(.+?)\R{2,}(.+?)\R{2,}(.+?)(?:\R{2,}|\Z)~s';

preg_match($pattern, $subject, $match);

<强> See it in action on ideone.com

我假设示例文本中的所有&nbsp;代表常规空格,而您只使用它们,因此我们可以看到有多个空格。如果您从一开始就使用SO的代码格式,那就没有必要了。这是格式的缩进样式;在用反引号格式化的文本中,空格仍然会崩溃。

我还假设您正在将整个文件读入内存,而不是逐行处理。正则表达式非常简单。从文本的开头(\A)开始,它不情愿地匹配并捕获它看到的所有内容((.+?),在单行模式下),直到它看到两个或多个连续的空格({2,} )。

之后,它不情愿地匹配和捕获,直到它连续看到两个或更多新行((.+?)\R{2,})。然后,它再次执行相同的操作以捕获第二和第三段。如果在第三段之后没有更多文本,最终(?:\R{2,}|\Z)就会出现。

\R,如果您不熟悉它,则是任何行分隔符的简写:\n\r\r\n和其他一些,不常见的。它得到了Perl,PHP(PCRE),Ruby 1.9+(Oniguruma)和其他一些版本的支持,但迄今为止还没有得到JavaScript,Python,Java或.NET的支持。