生成动态 sql 的正则表达式

Regex to generate dynamic sql

我想根据一些规则在 Notepad++ 上生成动态 sql。这些规则包括所有内容,因此不需要 sql 知识,具体如下:

  1. 动态 sql 必须用另一个单引号转义每个单引号('hello' 变为 ''hello'')
  2. 每行应以“+@lin”开头
  3. 如果一行只有空格,则“+@lin”后面不应有任何内容,尽管遵循规则
  4. 将“+@lin”后面的每个\t替换为“+@tab”
  5. 在@lin/@tab 序列后添加“+'”
  6. 在行尾添加单引号

因此,作为示例,此输入:

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个步骤:

请注意,这在大多数情况下都有效,除了第三次替换,它替换了所有选项卡,而不仅仅是开头的选项卡。我试过 (?<=^\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+ 字符串的串联。

参见 this regex online demo