2009-01-20 84 views
0

我有一個文本,我需要採取定義模式的內容。 MARK1MARK2之間的內容以及之後的內容MARK2。但是,這些標記可以重複,我需要採取所有的發生。在下面的例子中:以正則表達式分隔多個匹配的正則表達式

text: "textA textB _MARK1_ textC _MARK2_ textD _MARK1_ textE textF _MARK2_ textG textH textI" 

array(0): _MARK1_ textC _MARK2_ textD 
array(1): textC 
array(2): textD 
array(3): _MARK1_ textE textF _MARK2_ textG textH textI 
array(4): textE textF 
array(5): textG textH textI 

回答

1

這將是:

/(_MARK1_(.*?)_MARK2_((?:(?!_MARK1_).)*))/g 

至少,它適用於正則表達式教練對你的測試用例。
當然,你需要迭代每場比賽。
請注意,它可能不適用於所有類型的正則表達式:例如,JavaScript沒有前瞻斷言。

+0

完美。那是它 – 2009-01-20 21:43:35

0

我不認爲你可以用一個單一的表達式來實現這一點。可能需要將其分解爲初始表達式,然後循環執行第一次匹配的每次迭代的第二次表達式匹配。

0

我錯過了什麼,或者這是你在找什麼?

/(_MARK1_ (.*?) _MARK2 (.*?))*/ 

我做了你要如何處理空間,這我知道大概只相一致,讓您的例子情況下更容易閱讀一些武斷的假設。

0

我不確定您是否確實需要陣列中的分隔標記。除非你有特定的規格,否則這部分看起來是多餘的。這個解決方案假設你並不需要這個。既然你沒有指定一種語言,那麼Perl怎麼樣?

use Data::Dumper; 
my $text = 'textA textB _MARK1_ textC _MARK2_ textD _MARK1_ textE textF _MARK2_ textG textH textI'; 
my @results = $text =~ m/(?<=_MARK1_|_MARK2_)(.*?)(?=_MARK1_|_MARK2_|$)/g; 
print Data::Dumper::Dumper @results; 

但是,沒有理由嘗試使用正則表達式的一般情況。改用解析器。