使用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")。值返回空字符串

使用Regex进行动态导航提取

试试这样说:

(?<=FieldName=['"])[a-f'd]{8}-[a-f'd]{4}-[a-f'd]{4}-[a-f'd]{4}-[a-f'd]{12}(?=['"])

  1. (?<=FieldName=['"])字段名= "
  2. [a-f'd]{8}-[a-f'd] […]后面跟着GUID(这是实际匹配的)
  3. (?=['"])紧随其后的是 "

查看Regex101

您所遇到的问题基本上是您提供了量词{36},但没有告诉它要量化什么-您需要一些字符匹配表达式就在量词之前。举个例子,我刚刚加了''之前{36}在你的例子(意思是"匹配任何36个字符"),它似乎工作。哦,我还在"FieldName="后面添加了缺少的撇号:

Regex reg = new Regex(@"FieldName='(?<ReferenceId>.{36})");

工作示例:https://regex101.com/r/1tbien/1