2017-10-20 209 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

谢谢我打我的头撞墙! –

相关问题