【问题标题】:Getting only a substring of matching strings with RexEx使用 RegEx 仅获取匹配字符串的子字符串
【发布时间】:2014-11-18 16:30:04
【问题描述】:

我正在尝试过滤大型文本文件中的某些字符串。我想获取以某个单词开头并以引号结尾的字符串,但只有该字符串的最后一部分从该单词的最后一个点开始。更准确地说,我在文档中搜索类名,从基本命名空间开始,但我不需要完全限定的类名,只需要类名本身。 (例如,不是"NamespaceA.NamespaceB.NamespaceC.Classname",只有"Classname"

例如,从这个字符串:

sddkjasd"fhadslkfhdskljfahskjff"shkdfjhfkhafklj"NamespaceA.NamespaceB.NamespaceC.ClassnameA"swenbfjiwguzl"lgvfdu"eQVFZEIW"NamespaceA.NamespaceB.NamespaceC.ClassnameB"VDTZEvwqdtzevdzgi

我想要这些匹配:

ClassnameA
ClassnameB

NamespaceA 将始终相同,因此我可以将其用作开始条件,并使用结束引号。标记将始终存在,因此我可以将它们用作结束条件,但我不知道如何使用正则表达式仅选择从最后一个点开始的最后一个作品。当然我可以解决这个问题,例如对结果使用字符串操作(这就是我现在正在做的事情),或者对结果使用第二个正则表达式,但我很感兴趣是否有办法通过正则表达式直接获取此结果。目前,我正在匹配 NamespaceA.+?(?=\") 以获取完整的命名空间而无需关闭引号。分数。

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    使用否定字符类使正则表达式引擎匹配任何字符,但不匹配" 或点,这样它就不会贪婪地匹配点或引号。

    "NamespaceA.*?\.([^."]*)"
    

    "NamespaceA[^"]*?\.([^."]*)"
    

    使用上述任一正则表达式并从组索引 1 中获取类名。

    DEMO

    代码:

    String input = @"sddkjasd""fhadslkfhdskljfahskjff""shkdfjhfkhafklj""NamespaceA.NamespaceB.NamespaceC.ClassnameA""swenbfjiwguzl""lgvfdu""eQVFZEIW""NamespaceA.NamespaceB.NamespaceC.ClassnameB""VDTZEvwqdtzevdzgi";
    Regex rgx = new Regex(@"NamespaceA[^""]*?\.([^.""]*)""");
    foreach (Match m in rgx.Matches(input))
    Console.WriteLine(m.Groups[1].Value);
    

    IDEONE

    【讨论】:

      【解决方案2】:

      怎么样:

      NamespaceA(?:\.\w+)*\.(\w+)
      

      类名将在第 1 组中

      【讨论】:

        【解决方案3】:
        Namespace.*?\.(?=\w+")(\w+)
        

        试试这个。查看演示。

        http://regex101.com/r/zR2tR4/1

        【讨论】:

          猜你喜欢
          • 2011-08-21
          • 1970-01-01
          • 2019-03-14
          • 2020-11-13
          • 2021-11-22
          • 1970-01-01
          • 2021-09-10
          • 1970-01-01
          • 2014-07-17
          相关资源
          最近更新 更多