2011-05-08 110 views
1

我一直在研究一个正则表达式来分离一堆我需要解析到数据库中的文本文件。我的文件的格式如下:使用多个捕获组的正则表达式

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!-~](?: (?!))?)+?) 

我认为这将在文件的开头开始,捕捉所有内容,直到它遇到多个空格,然后抓住该行的其余部分。

+0

你在用什么语言? – 2011-05-08 01:22:52

+0

我使用PHP来完成一切。 – Tim 2011-05-08 01:34:27

+0

只为了解。在询问正则表达式问题时这很有用。 – 2011-05-08 01:35:46

回答

1

试试这个:

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

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

See it in action on ideone.com

我假设在你的示例文本所有这些 的代表常规空格,你只使用他们,所以我们可以看到,有更多的比一个空间。如果您从一开始就使用SO的代码格式,那就没有必要。这是缩进格式化的样式;在用反引号格式化的文本中,空格仍然被折叠。

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

之后,它很不情愿地进行匹配和捕获,直到它看到连续两个或多个换行符((.+?)\R{2,})。然后它再次做同样的事情来捕捉第二和第三段。最后的(?:\R{2,}|\Z)在第三段之后没有更多文本的情况下。

\R,如果你不熟悉它,是任何一种行分隔符的速记:\n\r\r\n和其他一些不常见的。它受Perl,PHP(PCRE),Ruby 1.9+(Oniguruma)和其他几个版本的支持,但不支持JavaScript,Python,Java或.NET。

+0

我使用上述模式的修改版本: 'code' /^(.*?){2,}( 。*?)\吨(。*?)\吨(。*?)\ T/S – Tim 2011-05-08 06:58:28