在 Notepad++ 中提取 SSIS 公式的正则表达式
Regex to extract SSIS formulas in Notepad++
我在 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)
我做了什么
在 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
来丢弃那一点。
我在 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)
我做了什么
在 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
来丢弃那一点。