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

时间:2009-11-06 07:24:15

标签: c# regex

我想在给定字符串中选择文本块。这些文本块具有几乎相似的模式。 例如,在下面给出的文本中,我想捕获以“客户端”开头的行,即我想选择下面文本中给出的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#。

提前致谢。

------------------ EDITED PART -------------------

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

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

如果单词“client”匹配,则除“client”之外的任何单词应在后续文本中匹配。 如果找到任何单词,则再次开始寻找“客户”。

2 个答案:

答案 0 :(得分:0)

由于项目3上的“)”,你的正则表达式可能会失败。添加a)到正则表达式并且看起来很好:

(\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'))*?

答案 1 :(得分:0)

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

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