2012-07-30 80 views
1

我匹配與reg_ex模式在使用preg_match_all中尋找模式,不包括配襯模式deliminator

$Structure = 'C:N:X:A:V:T:J:N:G:T:N:N:C:J:N:C:A:J:N:.:'; 
preg_match_all('/(T:|G:|L:|D:).*?(G:|i:|X:|\.:)/', $Structure, $arr, PREG_SET_ORDER); 

我得到的結果是

T:J:N:G: , T:N:N:C:J:N:C:A:J:N:.: 

我如何修改查詢,以便匹配的分隔符(G:| i:| X:|。:)不包含在查找中,但將用於下一個搜索。換句話說,使結果看起來如下:

T:J:N: , G:T:N:N:C:J:N:C:A:J:N: 

取而代之?

這可能嗎?

感謝

回答

1

有可能通過lookaheads,使用以下語法:

(?=G:|i:|X:|\.:) 

即不會消耗,該正則表達式匹配的片。

在旁註中,分隔符表示您將正則表達式包含的斜槓而不是您擁有的捕獲組。

+0

我不認爲他是指正則表達式分隔符。他指的是他特定字符串(例如T:和G:)內的分隔符。 – N13 2012-07-30 15:31:27

+0

我明白了。我只是假定它是他所匹配的字符串的一部分,但如果它具有某種特殊含義...... – Palladium 2012-07-30 15:33:04

2

是的,而不是讓你的第二個捕獲組消耗的投入,把它變成一個積極前瞻:

/(T:|G:|L:|D:).*?(?=(?:G:|i:|X:|\.:))/ 

現在,而不是匹配(和消費)的分隔符,這樣的:

(?=(?:G:|i:|X:|\.:)) 

表明正則表達式必須聲明從當前點開始存在分隔符,即正向量。

results in此:

"T:J:N:, G:T:N:N:C:J:N:C:A:J:N:"