1

我正在尝试使用正则表达式构造文本 - 以以下示例格式拆分和分组所有管理器:

General MANAGER
John Doe
(123) 456 7890
abcdefg@netcare.co.za
Nursing MANAGER
John Doe
(123) 456 7890
abcdefg@netcare.co.za
Financial MANAGER
John Doe
(123) 456 7890
Human Resource MANAGER
John Doe (Acting)
(123) 456 7890
abcdefg@netcare.co.za
Marketing OFFICER
John Doe
abcdefg@netcare.co.za
Pharmacy MANAGER
John Doe
(123) 456 7890
abcdefg@netcare.co.za
Technical Services MANAGER
John Doe
(123) 456 7890
abcdefg@netcare.co.za

我试过了

(?<FOUND>^.*?(manager|officer)+.*?)(manager|officer)+

期望它对这样的项目进行分组:

General Manager
John Doe
(123) 456 7890
abcdefg@netcare.co.za

但它并不完全有效。任何正则专家可以告诉我如何解决它?

我正在使用http://regexhero.net/tester/进行选项测试:CultureInvariant、ExplicitCapture、IgnoreCase、Multiline、SingleLine

4

2 回答 2

1

使用 RegexOptions.Multiline | 正则表达式选项.IgnoreCase

 ^(?<Title>.*(?:Manager|Officer)).*\n(?<Name>.*)(?:\n(?!.*(?:Manager|Officer))(?<Detail>.*))+$

见:http ://regexhero.net/tester/?id=1ac1bd9f-be0a-4bea-ac01-cc32a6605ae7

使用检索值

Match.Groups["Name"].Value
Match.Groups["Title"].Value
Match.Groups["Detail"].Captures[1..n].Value
于 2012-11-21T22:06:39.070 回答
0

如果文件中的最后一个字符是换行符,您可能想在正则表达式的末尾尝试肯定的前瞻断言。查找以 manager 或 officer 开头并且前面有 manager 或 officer 行或 EOF 的所有块。

(^.*?(manager|officer)(.*?$)*?)(?=(^.*?(manager|officer))|\Z)

但是,如果除了在新块开始时块数据结束这一事实之外真的没有其他结构,我个人更喜欢以下老式方法:

# WARNING: pseudocode 
managers = []
for line in file:
    if 'manager' in line or 'officer' in line: 
        manager = new Manager(line)
        managers.append(manager)
    else:
        manager.set_data(line)
于 2012-11-21T14:33:14.790 回答