正则表达式将组中的IIF条款分开

时间:2017-10-27 09:18:35

标签: ruby-on-rails regex

我试图获得一个正则表达式,将VB中制作的IIF部分分开,然后将其转换为RoR。我想要转换的字符串是这个:

Var007>2,IIF(Var133=2 OR Var133=3,'',Var132+IIF(Var123=2,Var122+IIF(Var113=2,Var112,0),0)+IIF(Var007>3,IIF(Var143=3,Var142,0),0)),''

我正在开发的正则表达式就是这个:

(.{1,}),(?![^\(]*\))(.{1,}),(?![^\(]*\))(.{1,})

我想得到这个:

  • Var007>2
  • IIF(Var133=2 OR Var133=3,'',Var132+IIF(Var123=2,Var122+IIF(Var113=2,Var112,0),0)+IIF(Var007>3,IIF(Var143=3,Var142,0),0))

现在,我得到了这个,因为无法在括号中选择一个组。

  • Var007>2,IIF(Var133=2 OR Var133=3,'',Var132+IIF(Var123=2,Var122+IIF(Var113=2,Var112,0),0)+IIF(Var007>3
  • IIF(Var143=3,Var142,0),0))

您可以在Rubular上看到它。

这是可能字符串的几个示例:

Var007>0,IIF(Var002=0,0, ((Var111*Var112)*CaracteristicaArticulo('Var002','Kilos M2')*(1+(CaracteristicaArticulo('Var002','Porcentaje Rozamiento')/100)))+IIF(Var022=1,Var112*0.800,0)+(Var112*0.339)),''
Var007>1,IIF(Var110=0,IIF(Var025=0 OR Var025=1 OR Var025=39 OR Var025=2,20,IIF(Var025=3 OR Var025=4,21,IIF(Var025=5 OR Var025=6 OR Var025=28 OR Var025=29,22,IIF(Var025=7 OR Var025=8 OR Var025=9 OR Var025=10,24,IIF(Var025=12,26,IIF(Var025=11 OR Var025=14 OR Var025=16 OR Var025=17,27,' ')))))),''),''

字符串文字中不会有单引号。

我需要你的帮助;)

1 个答案:

答案 0 :(得分:1)

用正则表达式解析这样的字符串通常不是一个好主意,但在这种情况下你的要求并不复杂。

这是一个匹配"令牌"的解决方案。由1个或多个1个字字符出现,后跟平衡量(...)且内部有'...'个子字符串(可能为())或字符组成除了,

s = "Var007>2,IIF(Var133=2 OR Var133=3,'',Var132+IIF(Var123=2,Var122+IIF(Var113=2,Var112,0),0)+IIF(Var007>3,IIF(Var143=3,Var142,0),0)),''"
rx = /
  (                                      # Group 1, what we need to extract
   (?:                                   # A non-capturing group acting as a container
      \w+                                # 1 or more word chars
          ( # Group 2 (technical one)
            \(                           # opening parenthesis
            (?:
               '[^']*'                   # a single quoted substring with no single quotes inside
              |                          # or
               [^()']+                   # 1 or more chars other than quote and parentheses
              |                          # or
               \g<2>                     # recurse Group 2 pattern
            )*                           # Group 2 end, can repeat 0 or more times
            \)                           # closing parenthesis
          )
     |
      [^,]                               # Any char other than a comma
   )+                                    # One or more occurrences of the alternatives in the container group
  )                                      # End of Group 1
  /x  # extended mode with all in-pattern whitespace ignored 

res = []
s.scan(rx) { |m|
    res << m[0]   # Only collect Group 1 values dropping all others
}
puts res

请参阅Ruby demo online

输出:

Var007>2
IIF(Var133=2 OR Var133=3,'',Var132+IIF(Var123=2,Var122+IIF(Var113=2,Var112,0),0)+IIF(Var007>3,IIF(Var143=3,Var142,0),0))
''