如何匹配可选令牌中的命名捕获组?

如何匹配可选令牌中的命名捕获组?

问题描述:

我开始与此正则表达式包含命名捕获组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

+操作符是贪婪的,并且与点组合会导致匹配发生到字符串的末尾和回溯,您将无法使用非贪婪+?量词或者是因为可选组所以我会考虑使用否定。

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

我试试这个正则表达式必要时应采取的。 (? +):

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

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