生成动态 sql 的正则表达式
Regex to generate dynamic sql
我想根据一些规则在 Notepad++ 上生成动态 sql。这些规则包括所有内容,因此不需要 sql 知识,具体如下:
- 动态 sql 必须用另一个单引号转义每个单引号('hello' 变为 ''hello'')
- 每行应以“+@lin”开头
- 如果一行只有空格,则“+@lin”后面不应有任何内容,尽管遵循规则
- 将“+@lin”后面的每个\t替换为“+@tab”
- 在@lin/@tab 序列后添加“+'”
- 在行尾添加单引号
因此,作为示例,此输入:
select 1,'hello'
from --two tabs exist after from
table1
应该变成:
+@lin+'select 1,''hello'''
+@lin+'from --two tabs exist after from'
+@lin
+@lin+@tab+'table1'
我现在有以下4个步骤:
- 用双引号替换单引号以涵盖规则 1
- 将
^(\t*)(.*)$
替换为\+@lin\+''
以涵盖规则2、5、6
- 将
\t
替换为\+@tab
以涵盖规则4
- 将
(\+@tab)*\+''$
替换为任何内容以涵盖规则 3
请注意,这在大多数情况下都有效,除了第三次替换,它替换了所有选项卡,而不仅仅是开头的选项卡。我试过 (?<=^\t*)\t
但没有成功 - 它什么都不匹配。
我正在寻找一种能够在尽可能少的替换步骤中满足规则的解决方案。
将单引号替换为2个引号后,您可以一步完成剩下的工作:
处理多个 TAB 不是很优雅,但它有效。
- Ctrl+H
- 查找内容:
^(?:(\t)(\t)?(\t)?(\t)?(\t)?(\S.*)|\h*|(.+))$
- 替换为:
+@lin(?1+@tab+(?2@tab+)(?3@tab+)(?4@tab+)(?5@tab+)'')(?7+'')
- 检查 匹配大小写
- 检查 环绕
- 检查 正则表达式
- 取消选中
. matches newline
- 全部替换
解释:
^ # beginning of line
(?: # non capture group
(\t) # group 1, tabulation
(\t)? # group 2, tabulation, optional
(\t)? # group 3, tabulation, optional
(\t)? # group 4, tabulation, optional
(\t)? # group 5, tabulation, optional
(\S.*) # group 6, a non-space character followed by 0 or more any character but newline
| # OR
\h* # 0 or more horizontal spaces
| # OR
(.+) # group 7, 1 or more any character but newline
) # end group
$ # end of line
替换:
+@lin # literally
(?1 # if group 1 exists
+@tab+ # add this
(?2@tab+) # if group 2 exists, add a second @tab+
(?3@tab+) # id
(?4@tab+) # id
(?5@tab+) # id
'' # content of group 6 with single quotes
) # endif
(?7 # if group 7 exists
+ # plus sign
'' # content of group 3 with single quotes
) # endif
截图(之前):
截图(后):
你可以在这里使用三个替换,因为你需要在相同的位置替换,所以不太可能(没有额外的假设)减少这里的步骤数。
步骤 1: 将单引号替换为双引号 - '
替换为 ''
。到目前为止还没有正则表达式,但您可以选中正则表达式复选框。
第二步: 在行首添加+@lin+
,如果有non-whitespace,只用'
包裹内容字符在线(同时将所有 TAB 保留在第一个 '
之前):
查找内容:^(\t*+)(\h*\S)?+(.*)
替换为:+@lin+(?2'':)
详情:
^
- 行首
(\t*+)
- 第 1 组 (</code>):零个或多个 TAB</li>
<li><code>(\h*\S)?+
- 第 2 组 (</code>):任意零个或多个水平空白字符的可选序列,然后是 non-whitespace 字符</li>
<li><code>(.*)
- 第 3 组 (</code>):行的其余部分</li>
<li><code>+@lin+(?2'':)
- 将匹配项替换为 +@lin+
+ 第 1 组值(即找到的选项卡),然后 - 仅当第 2 组匹配时 - '
+ 第 2 组 + 第 3 组值 + '
步骤 3:将 +@lin+
之后的每个 TAB 替换为 @tab+
:
查找内容:(\G(?!^)|^\+@lin\+)\t
替换为:@tab+
详情:
(\G(?!^)|^\+@lin\+)
- 第 1 组:要么
\G(?!^)
- 上一场比赛结束
|
- 或
^\+@lin\+
- 行首和 +@lin+
字符串
\t
- TAB 字符。
替换是第 1 组值和 @tab+
字符串的串联。
我想根据一些规则在 Notepad++ 上生成动态 sql。这些规则包括所有内容,因此不需要 sql 知识,具体如下:
- 动态 sql 必须用另一个单引号转义每个单引号('hello' 变为 ''hello'')
- 每行应以“+@lin”开头
- 如果一行只有空格,则“+@lin”后面不应有任何内容,尽管遵循规则
- 将“+@lin”后面的每个\t替换为“+@tab”
- 在@lin/@tab 序列后添加“+'”
- 在行尾添加单引号
因此,作为示例,此输入:
select 1,'hello'
from --two tabs exist after from
table1
应该变成:
+@lin+'select 1,''hello'''
+@lin+'from --two tabs exist after from'
+@lin
+@lin+@tab+'table1'
我现在有以下4个步骤:
- 用双引号替换单引号以涵盖规则 1
- 将
^(\t*)(.*)$
替换为\+@lin\+''
以涵盖规则2、5、6 - 将
\t
替换为\+@tab
以涵盖规则4 - 将
(\+@tab)*\+''$
替换为任何内容以涵盖规则 3
请注意,这在大多数情况下都有效,除了第三次替换,它替换了所有选项卡,而不仅仅是开头的选项卡。我试过 (?<=^\t*)\t
但没有成功 - 它什么都不匹配。
我正在寻找一种能够在尽可能少的替换步骤中满足规则的解决方案。
将单引号替换为2个引号后,您可以一步完成剩下的工作:
处理多个 TAB 不是很优雅,但它有效。
- Ctrl+H
- 查找内容:
^(?:(\t)(\t)?(\t)?(\t)?(\t)?(\S.*)|\h*|(.+))$
- 替换为:
+@lin(?1+@tab+(?2@tab+)(?3@tab+)(?4@tab+)(?5@tab+)'')(?7+'')
- 检查 匹配大小写
- 检查 环绕
- 检查 正则表达式
- 取消选中
. matches newline
- 全部替换
解释:
^ # beginning of line
(?: # non capture group
(\t) # group 1, tabulation
(\t)? # group 2, tabulation, optional
(\t)? # group 3, tabulation, optional
(\t)? # group 4, tabulation, optional
(\t)? # group 5, tabulation, optional
(\S.*) # group 6, a non-space character followed by 0 or more any character but newline
| # OR
\h* # 0 or more horizontal spaces
| # OR
(.+) # group 7, 1 or more any character but newline
) # end group
$ # end of line
替换:
+@lin # literally
(?1 # if group 1 exists
+@tab+ # add this
(?2@tab+) # if group 2 exists, add a second @tab+
(?3@tab+) # id
(?4@tab+) # id
(?5@tab+) # id
'' # content of group 6 with single quotes
) # endif
(?7 # if group 7 exists
+ # plus sign
'' # content of group 3 with single quotes
) # endif
截图(之前):
截图(后):
你可以在这里使用三个替换,因为你需要在相同的位置替换,所以不太可能(没有额外的假设)减少这里的步骤数。
步骤 1: 将单引号替换为双引号 - '
替换为 ''
。到目前为止还没有正则表达式,但您可以选中正则表达式复选框。
第二步: 在行首添加+@lin+
,如果有non-whitespace,只用'
包裹内容字符在线(同时将所有 TAB 保留在第一个 '
之前):
查找内容:^(\t*+)(\h*\S)?+(.*)
替换为:+@lin+(?2'':)
详情:
^
- 行首(\t*+)
- 第 1 组 (</code>):零个或多个 TAB</li> <li><code>(\h*\S)?+
- 第 2 组 (</code>):任意零个或多个水平空白字符的可选序列,然后是 non-whitespace 字符</li> <li><code>(.*)
- 第 3 组 (</code>):行的其余部分</li> <li><code>+@lin+(?2'':)
- 将匹配项替换为+@lin+
+ 第 1 组值(即找到的选项卡),然后 - 仅当第 2 组匹配时 -'
+ 第 2 组 + 第 3 组值 +'
步骤 3:将 +@lin+
之后的每个 TAB 替换为 @tab+
:
查找内容:(\G(?!^)|^\+@lin\+)\t
替换为:@tab+
详情:
(\G(?!^)|^\+@lin\+)
- 第 1 组:要么\G(?!^)
- 上一场比赛结束|
- 或^\+@lin\+
- 行首和+@lin+
字符串
\t
- TAB 字符。
替换是第 1 组值和 @tab+
字符串的串联。