2017-10-20 261 views
1

我想創建一個模式,使我能夠分裂字符串上的昏迷,但忽略大括號內的表達式。正則表達式字符串拆分

如果字符串中只存在一組大括號表達式,那麼我現有的代碼工作的很好。

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,Pressure1 ASC 

它的工作原理,大括號分組被忽略,每個字符串後與昏迷分裂爆發。

問題是。如果我需要在我的字符串中容納多個大括號表達式的分組,並且它開始失敗。

這種失敗:

{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 

分組中的一個被忽略,因爲它應該的,但大括號的另一組是沒有的。導致髒收集。

我會很感激這第二雙眼睛。

+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)))}
  • Site DESC
  • {IIF(Hemo.Site =「LV」,1,IIF(Hemo.Site =「SVC」 IIF(Hemo.Site = 「AO」,3,4)))}
  • 壓力1 ASC

但是,將無法正確分割字符串像

蘋果,潘基} ANA,胡蘿蔔{1,2,3},青蛙,貓,1,2,3

由於輸入「香蕉」}

+0

謝謝我打我的頭撞牆! –

相關問題