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 | を使用 RegexOptions.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

ファイルの最後の文字が改行である場合、正規表現の最後でポジティブ先読みアサーションを試してみることをお勧めします。マネージャーまたは役員で始まり、マネージャーまたは役員の行または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 に答える