2011-05-08 27 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