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