2016-11-22 3 views
4

私はこのタイプのデータのための正しい正規表現を把握するために失敗しています:複雑な正規表現:キーと値のペア

電話-仕事:1111111111電話・ファックスの仕事:222222222電話-一般: (333) 333-3333メール::[email protected]

所望の結果である:

Col1 Col2  Col3 
Phone Work  1111111111 
Phone Fax Work 222222222 
Phone General (333) 333-3333 
Email null  [email protected] 

キーは、2つの部分(第が欠落してもよい)からなる: Phone-Work:Email-:

キーの4種類が存在することができます:Phone-Email-User ID-、私はvalue参加し、新しいkey前に停止します正規表現を作成する方法を見つけ出すことができなかっ午前Web address-

。ここで

は、私はいくつかのデータをしようとしていますものです:

https://regex101.com/r/weEc3A/1

+0

さて、あなたはこの - ['(?sim)(電話|メール|ユーザーID | Webアドレス) - ([^:] *):\ s *((?:(?! | Email |ユーザーID | Webアドレス) - )。)*) '](https://regex101.com/r/ClS8zm/1) –

+1

@WiktorStribiżew、!!!!それを答えとして追加できますか? '(?sim)'とは何ですか? –

+0

申し訳ありませんが、 'm'は冗長です。 –

答えて

4

あなたは

(?si)(Phone|Email|User ID|Web address)-([^:]*):\s*((?:(?!(?:Phone|Email|User ID|Web address)-).)*) 
ようなソリューションを使用することができます

は、

と同等です
(?si)(Phone|Email|User ID|Web address)-([^:]*):\s*(.*?)(?=(?:Phone|Email|User ID|Web address)-|$) 

regex demo

詳細見る

  • (Phone|Email|User ID|Web address)-は - 以外のゼロ以上の文字をキャプチャ - 可能な出発値はグループ1
  • ([^:]*)にそれを捕捉-で追跡一致しますグループ2への:
  • :\s* - 0以上の空白で続けたコロン
  • ((?:(?!(?:Phone|Email|User ID|Web address)-).)*) - グループ3は、(?:Phone|Email|User ID|Web address)-パターンと一致するシーケンスを開始していないすべてのチャー(.)をキャプチャします。

(?s)修飾子が使用されているので、.も改行に一致します。 C#では、このインラインオプションの代わりにRegexOptions.Singlelineフラグを使用できます。 (?i)RegexOptions.IgnoreCaseフラグのインラインに相当します。組み合わされたとき、インライン修飾子は、括弧のペアの中に書くことができます:(?si)

+1

これをどのキーにも実装するのは非常に難しいでしょうか?私はそれが価値の終わりを検出することは不可能だろうと思う? –

+1

大文字と小文字を区別しないマッチングを有効にすると、 'Phone | Email | ...'と書くのではなく、 'phone | email | ...'(私は両方の仕事を知っていますが、IMOはあまり混乱しません) –

+0

特定のパターンを持っている場合は、キーリストの代わりにそのパターンを使用してみてください。キーリストが大きくない場合は、この方法を使用できます。また、交替を動的に構築することもできます。 –

1

たぶん、この1つはあなたのためのスタートです:

(.*?)-(.*?):\s*([-()+\[email protected]]+)(?![-\w]*:) 
+0

IMO少しでも_generic_、それをもっと使うための制約があります信頼性のある。電話番号と(特に)電子メールにマッチする正規表現はこれよりずっと複雑です。 –

+0

はい、しかしregex101サンプルのデータは非常に一般的なので、私はこれを与えます。あなたが望むなら、このマッチグループの一部を専門にするのは簡単だと思います。 – baddger964

関連する問題