代码之家  ›  专栏  ›  技术社区  ›  Nicolaesse

Regex在记事本中提取SSIS公式++

  •  0
  • Nicolaesse  · 技术社区  · 3 年前

    我在Microsoft SSIS中有一长串公式,必须将它们转换为SQL查询。我列表中的所有公式基本上都是按照以下规则制定的:

    • PART_1 ? PART_2 : PART_3 表示如果PART_1(测试)为真,则为PART_2,如果为假,则为PART_3
    • && 表示AND(对于PART_1(测试)中的不同条件)

    我的目标是在Notepad++中提取PART_1、PART_2和PART_3 来自大多数外部表达式 ,如以下示例:

    案例一

    表示 A>0 ? B : C

    • PART_ 1(测试)=> A>0
    • PART_ 2(如果为真)=> B
    • PART_ 3(如果为false)=> C

    案例II

    表示 A>0 && (A>10 ? A : -A) ? B : C

    • PART_ 1(测试)=> A>0 && (A>10 ? A : -A)
    • PART_ 2(如果为真)=> B
    • PART_ 3(如果为false)=> C

    案例III

    表示 A>0 ? B : (C>14 ? A*14 : -4)

    • PART_ 1(测试)=> A>0
    • PART_ 2(如果为真)=> B
    • PART_ 3(如果为false)=> (C>14 ? A*14 : -4)

    案例IV

    表示 A>0 ? (A>0 ? 2-B : C) : (C>14 ? A*14 : -4)

    • PART_ 1(测试)=> A>0
    • PART_ 2(如果为真)=> (A>0 ? 2-B : C)
    • PART_ 3(如果为false)=> (C>14?A*14:-4)

    我所做的

    在记事本++中,我制作了以下REGEX来提取三个部分

    PART_1(测试)

    .*?\?
    

    PART_2(如果为真)

    \?.*?:
    

    PART_3(如果为false)

    :.*
    

    没有标志的 “.匹配换行符” 选项

    主要的问题是,它们(当然)匹配所有内容,而不仅仅是最外部的表达式,所以我不能将它们与嵌套公式一起使用。 如何解决此问题?

    0 回复  |  直到 3 年前
        1
  •  0
  •   Dean Taylor    3 年前

    平衡圆括号

    基本问题归结为“平衡括号”,它可以与

    \((?>[^()]|(?R))*\)
    

    请参见此处:

    Regular expression to match balanced parentheses

    3个捕获组

    此表达式将整个表达式捕获到3个捕获组中

    ^((?:\((?>[^()]|(?R))*\)|[^?\(])+?)\s*\?\s*((?:\((?>[^()]|(?R))*\)|[^:\(\s])+?)\s*:\s*((?:\((?>[^()]|(?R))*\)|[^\$\s])+)$
    

    是的,它可以变得更简单,但我们使用它将组件分离为3个组件的3个表达式

    " condition “(第1部分)

    ^(?:(?:\((?>[^()]|(?R))*\)|[^?\(])+?)(?=\s*\?)
    

    假设从一行的开头开始。 (?=\s*\?) 是一个积极的展望。

    " value_if_true “(第2部分)

    ^((?:\((?>[^()]|(?R))*\)|[^?\(])+?)\s*\?\s*\K((?:\((?>[^()]|(?R))*\)|[^:\(\s])+?)(?=\s*:)
    

    基本上,这一个是由“条件”正则表达式组成的,然后是 \K 它把它扔掉了(所以它没有被捕获),然后我们想匹配什么,然后进行前瞻。 我们使用 K 这里是因为regex引擎(boost)Notepad++我认为不支持“正向查找”中的无限重复。

    " value_if_false “(第3部分)

    :\s*\K((?:\((?>[^()]|(?R))*\)|[^\$\s])+)$
    

    再次使用 K 来扔掉那一点。