我开始使用此正则表达式,其中包含指定的捕获组EntityType
,EntityName
和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 :(得分:2)
+
运算符是贪婪的,并且与点组合会导致匹配射到字符串和回溯的末尾,你将无法使用非贪婪的+?
量词是因为最后的可选组,所以我会考虑使用否定。
EntityType=(?<EntityType>[^&]+)&EntityName=(?<EntityName>(?:(?!&EntityId).)+)(?:&EntityId=(?<EntityId>[\w-]+))?
答案 1 :(得分:0)
如果有必要,我会尝试使用此正则表达式。
EntityType=((?:(?!(?:EntityType|EntityName|EntityId|&)).)*)\&EntityName=((?:(?!(?:EntityType|EntityName|EntityId)).)*)\&EntityId=((?:(?!(?:EntityType|EntityName|EntityId|&)).)*)