2010-02-11 68 views
2

我想要匹配A和C的值,但僅限於它們在同一段落內。正則表達式:段落內的匹配東西

A:one 
C:foo 

A:two 
B:rofl, some rubbish ::: 

A:three 
B:lol 
C:bar 

現在,我使用

/A:([a-z]*).*?C:([a-z]*)/s 

但是,這給了我「二」和「酒吧」,這不屬於一起。我如何排除我的/.*?/中的空行?

+0

+1的稱號,我喜歡這個詞'thingies'。 – Yacoby

回答

2

你將不得不禁止雙換行符。如果你的引擎允許向前看:

/^A:([a-z]*)(?:(?!(?:\r?\n){2,}).)*^C:([a-z]*)/sm 

這將適用於Windows/UNIX換行符,但不適用於Mac。這也將確保A和C在一行的開頭(注意m修飾符)。

+0

您是對的,感謝您的評論。你已經明白了,+1。 – nortron

0

這個工作對我來說:

/A:([a-z]*)\v*.*\v?C:([a-z]*)\v*/m 

基本上實現換行,然後專門佔了你在你的格局預計換行符(\v)(刪除包括換行)。

+1

如果超過3行,則會失敗。 –

+0

這個問題沒有提到超過3行的任何內容。 – SoapBox

0
$str=<<<A 
A:one 
C:foo 

A:two 
B:rofl, some rubbish ::: 

A:three 
B:lol 
C:bar 
A; 

$s = explode("\n\n",$str); 
foreach($s as $k){ 
    if(strpos($k,"A:") !==FALSE && strpos($k,"C:") !==FALSE){ 
     $a = array_filter ((preg_split("/([A-Z]):|\n+/sm",$k))); 
     print_r($a); 
    } 
} 

輸出

$ php test.php 
Array 
(
    [1] => one 
    [3] => foo 
) 
Array 
(
    [1] => three 
    [3] => lol 
    [5] => bar 
) 
+0

這並不完全回答我的問題,但我終於預先安排了這種分裂爲段落的方法。 +1 – blinry