javascript - 正则表达式拆分 iif 表达式

标签 javascript regex vbscript

我正在尝试测试一个 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/

相关文章:

javascript - 如何使用 javascript Promises 更新 mongodb 中的多个文档?

javascript - 将数组从 pug (jade) 传递到 jquery 脚本

javascript - 试图让 svg 路径顺利流动

JavaScript 正则表达式 : match all words with just some letters

c# - 从 VBScript 调用控制台应用程序中的函数

javascript - ng-show 通过时滚动页面?

regex - 正则表达式从字符串中删除不需要的文本

JavaScript 正则表达式捕获和替换

vbscript - sAMAccountName 和区分大小写

c# - 让 C# 识别 Visual Studio 之外的 dll