2017-10-20 14 views
1

私は文字列をコーマに分割し、中括弧の中の式を無視できるパターンを作成しようとしています。正規表現の文字列の分割

既存のコードは、文字列に中かっこの式のグループが1つのみ存在する場合に有効です。私はそれが動作する文字列に

{IIF(Hemo.Site = "LV",1,IIF(Hemo.Site = "SVC",2,IIF(Hemo_Pressures.Site = "AO",3,4)))},Site DESC,Pressure1 ASC 

を渡すと

Dim expression As New Regex(",(?=(?:[^\{]*\{[^\{]*\})*(?![^\}]*\}))") 

     Try 
      parts = expression.Split(sortString) 
      For Each Item In parts 
       If Not Item Is Nothing Then 
        result.Add(Item) 
       End If 
      Next 

      Return result 

、中括弧のグループ化は無視され、各文字列が後にコマ割りで勃発しています。

問題があります。文字列内に複数の中かっこ式のグループを格納する必要がある場合、失敗するようになります。それがあるべきとしてグループ化の

{IIF(Hemo.Site = "LV",1,IIF(Hemo.Site = "SVC",2,IIF(Hemo_Pressures.Site = "AO",3,4)))},Site DESC,{IIF(Hemo.Site = "LV",1,IIF(Hemo.Site = "SVC",2,IIF(Hemo.Site = "AO",3,4)))}, Pressure1 ASC 

1は無視されますが、中括弧の他のグループ分けではありません。

これは失敗します。汚れたコレクションが作成されました。

私はこれについて目の第二のペアをいただければ幸いです。

+0

これは、(?![^ {] * \}) 'を試してください。私は網羅的なテストをしていないが、それは私のために働いているようだ。 –

+0

完璧に動作します...私のパターンよりもはるかにエレガントです。 –

+0

'1,2 '、{1,2,3}、4,5、} 6が正しく分割されないなど、分割する必要があるコンマの間に'} 'が含まれているテキストがある場合、問題が見つかりました。うまくいけばそれはあなたにとって問題ではないでしょう。 –

答えて

0

{または}がテキスト内に浮かんでいない限り、パターン,(?![^{]*\})は私のために働いているようです。あなたが必要な場合は、直ちにカンマの前後にスペースをトリミングする*,(?![^{]*\}) *を使用することができます

, 
zero-width negative lookahead 
    Any character not in "{" 
    * (zero or more times) 
    } 
End Capture 

のように分類

、それが評価されます。あなたのテスト文字列で


が、それは以下の分割を生成します。

  • {IIF(Hemo.Site = "LV"、1、IIF(Hemo.Site = "SVC"、2、 IIF(Hemo.Site = "AO"、3,4)))
  • サイトDESC
  • {IIF(Hemo.Site = "LV"、1、IIF(Hemo.Site = "SVC"、2、 IIF(Hemo.Site = "AO"、3,4))))
  • 圧力1 ASC

しかし、それは正しく

アップル、潘} ANA、ニンジン、{1,2,3}、カエル、猫、1,2,3-

のような文字列を分割するために失敗します。

が "バナナ"の}を失うために

+0

ありがとう私は壁に頭を打っていた! –

関連する問題