【问题标题】:Regex non capturing group ignored?正则表达式非捕获组被忽略?
【发布时间】:2014-12-23 11:07:03
【问题描述】:

我有一个这样的字符串:

  <Field ID="{2B35B1DD-822A-47E2-9F8C-77006123FA45}"
       Name="NCPE_QualificationTitle"
       StaticName="NCPE_QualificationTitle"
       DisplayName="$Resources:Exigy.NCPE.ProfessionalDirectory.Structure,Fields_NCPE_QualificationTitle_DisplayName;"
       Description="$Resources:Exigy.NCPE.ProfessionalDirectory.Structure,Fields_NCPE_QualificationTitle_Description;"
       Group="$Resources:Exigy.NCPE.ProfessionalDirectory.Structure,NCPE_Group;"
       Type="Text"
    Required="FALSE" />

我正在尝试使用这个正则表达式:

(?:\$Resources:.*,).*(?:;)

我认为应该给我Fields_NCPE_QualificationTitle_DisplayName,因为它是非捕获组中的唯一部分。但是它匹配这个字符串:

"$Resources:Exigy.NCPE.ProfessionalDirectory.Structure,Fields_NCPE_QualificationTitle_DisplayName;"

我在做什么/理解错误?

【问题讨论】:

  • 很高兴看到您正在使用的代码,但您确定您正在从组中获取捕获(实际上您没有任何捕获组我可以看到)而不是整个正则表达式匹配?您引用的内容看起来(一目了然)是正则表达式匹配的文本。然后,您可以检查其中的捕获组。

标签: c# regex


【解决方案1】:

您只需要将第一个非捕获组转为正向后视(?&lt;=...),将第二个非捕获组转为正向超前(?=...)

(?<=\$Resources:.*,).*(?=;)

IDEONE

Regex rgx = new Regex(@"(?<=\$Resources:.*,).*(?=;)");

默认情况下,它将打印Groups[0],即包含所有匹配字符的索引0。

【讨论】:

  • 是的,c#支持这个功能。
【解决方案2】:
(?:\$Resources:.*,)(.*)(?:;)

试试这个并从中获取捕获或组 1。查看演示。

https://regex101.com/r/vN3sH3/68

您的正则表达式不会对任何数据进行分组,因此会返回整个匹配项。一旦您引入了一个组,您就可以通过指定组 1 或组 2 来访问它

【讨论】:

    猜你喜欢
    • 2018-10-29
    • 2018-02-07
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 2019-01-12
    相关资源
    最近更新 更多