Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 正则表达式分组分隔IIF子句_Ruby On Rails_Regex - Fatal编程技术网

Ruby on rails 正则表达式分组分隔IIF子句

Ruby on rails 正则表达式分组分隔IIF子句,ruby-on-rails,regex,Ruby On Rails,Regex,我试图得到一个正则表达式,它将用VB生成的IIF的各个部分分离出来,并将其转换为RoR if。我尝试转换的字符串如下: 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,}) 我

我试图得到一个正则表达式,它将用VB生成的IIF的各个部分分离出来,并将其转换为RoR if。我尝试转换的字符串如下:

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)),''
(.{1,}),(?![^\(]*\))(.{1,}),(?![^\(]*\))(.{1,})
我想得到这个:

  • Var007>2
  • IIF(Var133=2或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或Var133=3',,Var132+IIF(Var123=2,Var122+IIF(Var113=2,Var112,0),0)+IIF(Var007>3
  • IIF(Var143=3,Var142,0),0))
你可以在电视上看到它

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

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,' ')))))),''),''
字符串文本中不会有单引号


我需要你的帮助;)

用regex解析这样的字符串通常不是一个好主意,但在这种情况下,您的需求并没有那么复杂

下面是一个解决方案,它将匹配由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

Try不起作用,它只匹配第二个组,不会为每个零件创建一个组。谢谢。它能用,给我看看你的代码。您没有正确使用正则表达式。你可以在这里看到第1组和第3组是空的。最后一个问题:括号内是否有字符串文字?我现在正在尝试,在你的示例中,它似乎起作用了。现在我必须确保它适用于来自API的每个字符串。非常感谢。@PacoGómezCapón这就是为什么我要求确切的要求。你必须在说“oh-I-may-have-other-string”之前发布它们。我知道,但API返回了近千个这样的字符串,我认为这会起作用,但不是100%确定。谢谢