2014-10-30 69 views
-1

我開始與此正則表達式包含命名捕獲組EntityTypeEntityName,和EntityId如何匹配可選令牌中的命名捕獲組?

EntityType=(?<EntityType>.+)&EntityName=(?<EntityName>.+)&EntityId=(?<EntityId>[\w-]+) 

每組針對該文本相匹配(注意在第二實施例&符):

EntityType=FundingRnd&EntityName=ABC&EntityId=df78abcd-fb75-473d-a4bb-412a9d89215c 
EntityType=FundingRnd&EntityName=ABC & XYZ&EntityId=df78abcd-fb75-473d-a4bb-412a9d89215c 

然後我發現最後的EntityId部分必須是可選的,所以我用()?包裝了正則表達式的EntityId部分:

EntityType=(?<EntityType>.+)&EntityName=(?<EntityName>.+)(&EntityId=(?<EntityId>[\w-]+))? 

現在EntityId組不再匹配相同的文本。

我正在使用帶有「忽略大小寫」開關的.NET Framework正則表達式引擎。測試工具是this one,它使用.NET引擎。

任何想法?目的是從這些組中提取文本。

+0

試'的EntityType =&實體名稱=( [^&] +)(&ENTITYID =( [\ W - ] +) )?'看到它在這裏:http://regex101.com/r/kI4tV3/1 – 2014-10-30 02:46:52

+0

@JorgeCampos道歉,我沒有舉一個很好的例子。問題是EntityName的值可能包含&符號。 – 2014-10-30 02:53:46

+0

哼,現在這是一個問題...看看我能想出來... – 2014-10-30 02:55:27

回答

2

+操作符是貪婪的,並且與點組合會導致匹配發生到字符串的末尾和回溯,您將無法使用非貪婪+?量詞或者是因爲可選組所以我會考慮使用否定。

EntityType=(?<EntityType>[^&]+)&EntityName=(?<EntityName>(?:(?!&EntityId).)+)(?:&EntityId=(?<EntityId>[\w-]+))? 

Live Demo

+0

道歉,我沒有舉一個很好的例子。問題是EntityName的值可能包含&符號。 – 2014-10-30 02:52:02

+0

@AlexAngas修復了編輯。 – hwnd 2014-10-30 02:58:17

+1

+1我幾乎在那裏:) – 2014-10-30 03:06:52

0

我試試這個正則表達式必要時應採取的。 (? +):

EntityType=((?:(?!(?:EntityType|EntityName|EntityId|&)).)*)\&EntityName=((?:(?!(?:EntityType|EntityName|EntityId)).)*)\&EntityId=((?:(?!(?:EntityType|EntityName|EntityId|&)).)*) 

SEE DEMO?http://regex101.com/r/fM1mC8/2