【问题标题】:Regex to extract SSIS formulas in Notepad++正则表达式在 Notepad++ 中提取 SSIS 公式
【发布时间】:2022-01-08 20:16:03
【问题描述】:

我在 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(如果为假)=> C

案例二

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

  • PART_1(测试)=> A>0 && (A>10 ? A : -A)
  • PART_2(如果为真)=> B
  • PART_3(如果为假)=> C

案例三

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

  • PART_1(测试)=> A>0
  • PART_2(如果为真)=> B
  • PART_3(如果为假)=> (C>14 ? A*14 : -4)

案例四

表达式: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(如果为假)=> (C>14 ? A*14 : -4)

我做了什么

在记事本++中我做了以下正则表达式来提取三个部分

PART_1(测试)

.*?\?

PART_2(如果为真)

\?.*?:

PART_3(如果为假)

:.*

没有标记 "。匹配换行符" 选项。

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

【问题讨论】:

  • 一般来说,这里需要一个像ANTLR这样的表达式解析器;正则表达式本身不能很好地处理嵌套内容。

标签: regex ssis notepad++ ssis-2012 ssis-2008


【解决方案1】:

平衡括号

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

\((?>[^()]|(?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”(第二部分)

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

基本上,这个由“条件”正则表达式组成,然后是 \K 将其丢弃(因此它不会被捕获),然后是我们想要匹配的内容,然后是前瞻。 我们在这里使用\K,因为我认为正则表达式引擎(增强)Notepad++ 不支持“positive-lookbehind”中的无限重复。

value_if_false”(第三部分)

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

再次在此处使用\K 将其丢弃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 2022-10-15
    • 2012-04-01
    • 2017-02-08
    相关资源
    最近更新 更多