我想要匹配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
但是,這給了我「二」和「酒吧」,這不屬於一起。我如何排除我的/.*?/中的空行?
我想要匹配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
但是,這給了我「二」和「酒吧」,這不屬於一起。我如何排除我的/.*?/中的空行?
你將不得不禁止雙換行符。如果你的引擎允許向前看:
/^A:([a-z]*)(?:(?!(?:\r?\n){2,}).)*^C:([a-z]*)/sm
這將適用於Windows/UNIX換行符,但不適用於Mac。這也將確保A和C在一行的開頭(注意m
修飾符)。
您是對的,感謝您的評論。你已經明白了,+1。 – nortron
這個工作對我來說:
/A:([a-z]*)\v*.*\v?C:([a-z]*)\v*/m
基本上實現換行,然後專門佔了你在你的格局預計換行符(\v
)(刪除包括換行)。
如果超過3行,則會失敗。 –
這個問題沒有提到超過3行的任何內容。 – SoapBox
$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
)
這並不完全回答我的問題,但我終於預先安排了這種分裂爲段落的方法。 +1 – blinry
+1的稱號,我喜歡這個詞'thingies'。 – Yacoby