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

时间:2014-10-30 02:35:41

标签: .net regex

我开始使用此正则表达式,其中包含指定的捕获组EntityTypeEntityNameEntityId

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引擎。

有什么想法吗?目的是从每个组中提取文本。

2 个答案:

答案 0 :(得分:2)

+运算符是贪婪的,并且与点组合会导致匹配射到字符串和回溯的末尾,你将无法使用非贪婪的+?量词是因为最后的可选组,所以我会考虑使用否定。

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

Live Demo

答案 1 :(得分:0)

如果有必要,我会尝试使用此正则表达式。

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

查看演示: http://regex101.com/r/fM1mC8/2