我正在尝试测试一个 Regex,它应该能够将以下表达式分成 3 个部分:
- 测试
- 正确
- 错误
如果有多个 iif
嵌套,它应该给我多个匹配
我有一些模式:
iif(testExpression, trueExpression, falseExpression)
iif((@HasMinimunRegulatedCAR@==0),(([t219]>1.5) OR ([t219]<-0.5)),(([t223]>1.5) OR ([t223]<-0.5)))
iif((@HasMinimunRegulatedCAR@==1), iif((@MFIUsePAR30@==1), ([t224]>0.25), iif((@MFIUsePAR90@==1), ([t225]>0.25), (1==1))), iif((@MFIUsePAR30@==1), ([t220]>0.25), iif((@MFIUsePAR90@==1), ([t221]>0.25),(1==1))))
我正在使用这个表达式,但是当我有多个 iif
嵌套时它不起作用
(^(iif\()|[^,]+)
我正在使用以下方法运行我的测试: https://regex101.com/
预期的输出应该是
testExpression
trueExpression
falseExpression
(@HasMinimunRegulatedCAR@==0)
([t219]>1.5) OR ([t219]<-0.5)
([t223]>1.5) OR ([t223]<-0.5)
(@HasMinimunRegulatedCAR@==1)
iif((@MFIUsePAR30@==1), ([t224]>0.25), iif((@MFIUsePAR90@==1), ([t225]>0.25), (1==1)))
iif((@MFIUsePAR30@==1), ([t220]>0.25), iif((@MFIUsePAR90@==1), ([t221]>0.25),(1==1)))
最佳答案
如果 .Net 正则表达式是一个选项,您可以使用 balancing groups捕获您的 iif
。
一个选项会将所有嵌套的括号捕获到一个名为 Exp
的组中:
(?>
(?:iif)?(?<Open>\((?<Start>)) # When seeing an open parenthesis, mark
# a beginning of an expression.
# Use the stack Open to count our depth.
|
(?<-Open>(?<Exp-Start>)\)) # Close parenthesis. Capture an expression.
|
[^()\n,] # Match any regular character
|
(?<Exp-Start>),(?<Start>) # On a comma, capture an expression,
# and start a new one.
)+?
(?(Open)(?!))
Working Example ,切换到表格标签。
此选项捕获的数据比您要求的要多,但它确实为您提供了完整解析方程式所需的完整数据。
另一种选择是只捕获顶级部分:
iif\(
(?:
(?<TopLevel>(?>
(?<Open>\() # Increase depth count using the Open stack.
|
(?<-Open>\)) # Decrease depth count.
|
[^()\n,]+ # Match any other boring character
|
(?(Open),|(?!)) # Match a comma, bun only if we're already inside parentheses.
)+)
(?(Open)(?!))
|
,\s* # Match a comma between top-level expressions.
)+
\)
Working Example
在这里,组 $TopLevel
将有三个捕获。例如,在您的最后一个示例中,它捕获:
捕获 0:(@HasMinimunRegulatedCAR@==1)
捕获 1:iif((@MFIUsePAR30@==1), ([t224]>0.25), iif((@MFIUsePAR90@==1), ([t225]>0.25), (1==1) ))
捕获 2:iif((@MFIUsePAR30@==1), ([t220]>0.25), iif((@MFIUsePAR90@==1), ([t221]>0.25),(1==1) ))
关于javascript - 正则表达式拆分 iif 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48296957/