在 Notepad++ 中提取 SSIS 公式的正则表达式

Regex to extract SSIS formulas in Notepad++

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

我的目标是在 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)

我做了什么

在 Notepad++ 中,我制作了以下 REGEX 来提取这三个部分

PART_1(测试)

.*?\?

PART_2(如果为真)

\?.*?:

PART_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 是因为正则表达式引擎 (boost) Notepad++ 我认为不支持“正向后视”中的无限重复。

"value_if_false"(第 3 部分)

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

在这里再次使用 \K 来丢弃那一点。