使用Regex进行动态导航提取
本文关键字:导航 提取 动态 Regex 使用 | 更新日期: 2023-09-27 18:17:07
嗨,我需要从下面的字符串
中提取Guid <PageFieldFieldValue:FieldValue FieldName='fa564e0f-0c70-4ab9-b863-0177e6ddd247' runat='server'></PageFieldFieldValue:FieldValue>
<PageFieldRichImageField:RichImageField FieldName="3de94b06-4120-41a5-b907-88773e493458" runat="server"></PageFieldRichImageField:RichImageField>
在这种情况下,我需要得到的是"fa564e0f-0c70-4ab9-b863-0177e6ddd247"answers"3de94b06-4120- 4a5 -b907-88773e493458",但是这个guid是动态的,每次都会改变,而且字符串中有很多guid,我需要得到所有这些guid,以便我可以将它们添加到集合中。注意:字符串实际上是一个aspx页面内容。所有节点是不同的,但有相同的属性"FieldName",我需要得到。
我浏览了链接c# RegEx字符串提取并以相同的方式构造了RegEx。以下是我所做的:
string s = @"<PageFieldFieldValue:FieldValue FieldName='fa564e0f-0c70-4ab9-b863-0177e6ddd247' runat='server'>
</PageFieldFieldValue:FieldValue>";
Regex reg = new Regex(@"FieldName=(?<ReferenceId>{36})");
Match match = reg.Match(s);
string guid = match.Groups["ReferenceId"].Value;
无论如何,这对我不起作用。我得到异常"解析"FieldName=(?{35})"-在创建Regex对象"reg"时,量词{x,y}后面跟着nothing."
如果我不使用{36},这应该是GUiD的长度:
Regex reg = new Regex(@"FieldName=(?<ReferenceId>)")
我没有得到任何例外,但我也没有得到想要的结果。match.Groups("ReferenceId")。值返回空字符串
试试这样说:
(?<=FieldName=['"])[a-f'd]{8}-[a-f'd]{4}-[a-f'd]{4}-[a-f'd]{4}-[a-f'd]{12}(?=['"])
-
(?<=FieldName=['"])
按字段名= 和 " 或 -
[a-f'd]{8}-[a-f'd]
[…]后面跟着GUID(这是实际匹配的) -
(?=['"])
紧随其后的是 " 或
(?<=FieldName=['"])
按字段名= 和 " 或[a-f'd]{8}-[a-f'd]
[…]后面跟着GUID(这是实际匹配的)(?=['"])
紧随其后的是 " 或查看Regex101
您所遇到的问题基本上是您提供了量词{36},但没有告诉它要量化什么-您需要一些字符匹配表达式就在量词之前。举个例子,我刚刚加了''之前{36}在你的例子(意思是"匹配任何36个字符"),它似乎工作。哦,我还在"FieldName="后面添加了缺少的撇号:
Regex reg = new Regex(@"FieldName='(?<ReferenceId>.{36})");
工作示例:https://regex101.com/r/1tbien/1