2016-11-20 7 views
0

私はこのRegExに本当に近いと思いますが、私はそれを終わらせるために目をつけてくれることを期待していました。私は会社の販売履歴.csvエクスポートを持っています。輸出のitem列は、いくつかの異なるフィールドを連結したもので、キャプチャグループを使用して再び個別の列に分解したいと考えています。それは記入項目のためのすべての情報を持っている場合、列は次のようになります。RegExを使って連結された文字列を解析して個々のフィールドに戻す

Vendor:Item Number (Item Description)

しかし、時には古いシステムは、ベンダーを持っていない、または説明を持っていないので、それは単に省いたものそれらは挿入しません:区切り記号または空の括弧。

Item Number

Vendor:Item Number

Item Number (Description)

そして、残念ながら、

Item Number (Description (extra nested parenthesis))

私はラインとのトラブルを抱えている:私はこのようになり、輸出の行を持っています説明が全くない記述部分にネストされたかっこがあります。これはこれまで私が思いついたことです。助けを前にありがとう。

https://regex101.com/r/JEzBAJ/3

+0

常に1行だけで、解析したいだけですか、まったく一致しないガベージ・ラインもありますか?どの言語/ツールを使用しますか? –

+0

この目的のために、各行には少なくともItem Number取得グルー​​プに何かがあるはずです。ガベージ・ラインはありません。@SebastianProske –

答えて

2

私たちはここにセパレータとして:(を使用し、説明などの最終的な(後ベンダーとすべてのものとして最終的:前に、すべてを一致させることができると思います。

^(?:([^:\n]+):)?([^(\n]+)(.+)? 

は、このように、ここで使用することができ、文字列の先頭にいないだけで、ラインの各開始時にそう^試合、あなたは複数行モードを使用する必要があることに注意してください。

  • (?:([^:\n]+):)? - 必要に応じて文字列の先頭からすべての非:と一致し、:
  • ([^(\n]+)下記 -
  • (いずれも存在しない場合、それはラインのリマインダーにマッチする)毎に非 (と一致
  • (.+)? - (あれば()が存在する場合は、その行のリマインダに一致します。

Hello (WorldがベンダーとしてマッチされるだろうHello (World:Meow)との潜在的な間違いがあります - それは正当なケースで、番号と説明と一致する必要がある場合によっては、あなたが^(?:([^(:\n]+):)?([^(\n]+)(.+)?にパターンを調整したい場合があります。

firstsecondパターンのデモがあります。

+0

美しい。 2番目のパターンは、私が解決しようとしていたものです。どうもありがとうございました。 –

関連する問題