代码之家  ›  专栏  ›  技术社区  ›  Shekhar

如何使用正则表达式捕获重复文本块?

  •  -1
  • Shekhar  · 技术社区  · 15 年前

    我想选择给定字符串中的文本块。这些文本块具有几乎相似的模式。 例如,在下面给出的文本中,我想捕获以“client”开头的行,即我想选择下面文本中给出的3个客户端的信息。 有时,这些信息可能不是以“客户”开头,而是以“客户”或“项目名称”或“雇主”开头。

    1. Client Name
              The XXX Company
    Title
              Application Dev Office 
    Period
              September 2008 Till date 
    Role
              Quality Analyst Lead
    Responsibilities
             Testing
    
    Client Name
              The XYZ Company
    Title
              Application web
    Period
              September 2009 Till date 
    Role
              Quality Tester Lead
    Responsibilities
             Testing and destroying
    
    
    3) Client Name
              The 1234 Company
    Title
              Application web RIA
    Period
              September 2209 Till date 
    Role
              Quality Lead
    Responsibilities
             Developer
    

    我为此创建了一个正则表达式,如下所示:

    (\n|\r|\a|\f)(\s|\d|\.)*?
    (?<id>(Client|Customer|Role|Organi(s|z)ation|Vendor|Company|Employer))
    (\s|\S)*?(?=(\n|\r|\a|\f)(\s|\d|\.)*?(\k'id'))*?
    

    (\n|\r|\a|\f) 因为当我将文本从文件加载到字符串变量中时,^无法识别这些字符。

    这个正则表达式的问题是,它能够识别前两个客户机的信息,但不能识别最后一个客户机的信息。

    我用C#来做这个。

    提前谢谢。

    ------------------编辑部分-------------------

    我需要像regex一样开发,如果客户相关信息以单词“client”开头,那么看看是否存在诸如“role”、“environment”、“vendor”之类的单词。如果存在这样的单词,那么我们只能说它是客户相关信息。 但在某些情况下,这些信息可以以“雇主”等其他词开头。在这种情况下,我们仍然需要搜索“角色”、“环境”、“供应商”等词。 这就是我创建类似正则表达式的

    (?<id>(Client|Customer|Role|Organi(s|z)ation|Vendor|Company|Employer))
    

    如果单词“client”匹配,则除“client”之外的任何单词都应在后续文本中匹配。

    2 回复  |  直到 15 年前
        1
  •  0
  •   Wolfwyrd    15 年前

    (\n|\r|\a|\f)(\s|\d|\.|\))*?(?<id>(Client|Customer|Role|Organi(s|z)ation|Vendor|Company|Employer))(\s|\S)*?(?=(\n|\r|\a|\f)(\s|\d|\.)*?(\k'id'))*?
    
        2
  •  0
  •   Jeremy Stein    15 年前

    这将抓取每个客户端块,如果这是您想要的:

    Regex regexObj = new Regex("^[^A-Za-z]*Client(?:(?!^[^A-Za-z]*Client).)*", RegexOptions.Singleline | RegexOptions.Multiline);