Notepad ++复杂条件搜索正则表达式

时间:2017-08-09 09:39:02

标签: regex replace conditional notepad++

我有一个数据库SQL,后跟一堆语句来收集统计信息。我想在SQL中搜索特定的连接并查找所有相应的collect统计语句,然后修改它们以删除无关的字符以最终提取一组有用的语句。输入

          select tbd.cola , tba.a, tbx.b, 
                                   tbc.r,
                             tbx.c ,
                       case when yada ya then tbx.c + xyz else 'daddy' end as nicecol
                       , tbx.g
               from 
               tbd  join tba on tbd.cola  =   tba.colb 
                  left join
               tbx on tbx.colp= tba.colp left join
               tbc on tbc.colfff=tbx.colm join......


        /*this is followed by a bunch of statements in format */
            ---- "collect stats column (cola,colbxx) 
    on tbd ( medium strong )" 
            ----      "collect stats column (colfff) on tbc ( not 
    strong )" 
          ----   "collect stats column ( colddsdsd) on tbc (    very strong  )" 
                 ----"collect stats col (yada,secretxxx,xxx) on tbx ( strong ) "

        note the spacing between  follows logic 
                 (/s*medium|not|very/s*strong/s*)
        same thing for 
         ----   "collect stats column 

        in other words - variable spacing between all the words.
 No consistent spacing pattern and 
the statements arbitrarily span between multiple lines or squeeze in a single line.

我想做的是:

  • 搜索要加入的列名e.g. tbd.cola = tba.colb
  • 然后在我们的案例中查看collect statistics语句中的这些列名 cola colp colm colfff是否加入来自

    的列名

    tbd join tba on tbd.cola = tba.colb left join tbx on tbx.colp= tba.colp left join tbc on tbc.colfff=tbx.colm
    我们在收集统计报表和以下资格中搜索这些内容

    ---- "collect stats column (cola,colbxx) on tbd ( medium strong )" ---- "collect stats column (colfff) on tbc ( not strong )"

  • 接下来,这些陈述必须“净化”,以便无关的字符和&在em周围写入被删除。理想的输出格式在

    之下

    collect stats column (cola,colbxx) on tbd; collect stats column (colfff) on tbc ;
    删除---- "模式[-]+?"
    使用( <string with or without space and with variable spaces around it> )"

  • 替换( not strong )"表单的;


 我做的是多步骤过程。我可以使用管理第三部分 "\s*([^"]+ strong\s*)\)
这样就好了,但我在这里寻找条件选择方法。需要帮助w /前两个。
无需使用边界来选择collect stats语句。我可以使用鼠标选择该部分,然后仅在所选部分中使用正则表达式

的逻辑是
  • 搜索join\s*tablename.column\s*\=\s*tablename.column模式。 \==已转义
  • 将所有匹配的列名称收集到缓冲区
  • 然后创建边界或物理选择collect statistics语句开始的部分。
  • 通过一系列collect stats语句运行选择列列表以查看哪个符合条件。 如果有collect stats column (cola,colbxx)之类的列组合,且只有cola是一个连接列 - 也会选择该列,因为其中一个列是连接列
  • 最后,我们有一个入围的收集统计信息语句群,我们运行最后一个正则表达式(逻辑"\s*([^"]+ strong\s*)\))以消除无关的字符。
  • 我们可以将此操作分解为2个组件。第一部分是条件搜索。在“收集统计信息”区域中搜索已加入的列名称。将搜索结果复制并粘贴到另一个工作区(新文件)中,然后在此选定文件上运行上面的最后一部分。

1 个答案:

答案 0 :(得分:1)

好的我发现了什么!它适用于您给出的示例,但我无法预料到所有可能性,请告诉我它是否适合您。

它使用2次替换。确保你检查了正则表达式和它旁边的方框(说&#34;。匹配新行&#34;)

第一次替换:
替换它:
join\s+\w+\s+on\s+\w+\.(\w+)\b\s*=\s*\w+\.(\w+)\b(?=.*-+\s+"([^"]+(?:\1|\2)[^"]+)(\s)+\([^)]+\)")|.
由此:
\3\4

第二次替换:
替换它:
(collect.*?)\s+(on\s\w+)\s
由此:
`\ 1 \ 2; \ n

<强>演示

第一次替换:Regex101
第二次替换:Regex101

<强>说明

正则表达式基于交替。第一部分是 join\s+\w+\s+on\s+\w+\.(\w+)\b\s*=\s*\w+\.(\w+)\b(?=.*-+\s+"([^"]+(?:\1|\2)[^"]+)(\s)+\([^)]+\)")

join\s+\w+\s+on\s+\w+\.(\w+)\b\s*=\s*\w+\.(\w+)\b匹配如下构造的字符串:在tbname.cola = tbname.colb 上加入tbname。请注意=周围的空格是可选的,并且捕获可乐和colb的名称以备将来使用。

(?=.*-+\s+"([^"]+(?:\1|\2)[^"]+)(\s)+\([^)]+\)")只允许先前的匹配,如果文件后面有一个字符串,如 ----&#34; [...] [cola OR colb] [...]([.. 。))&#34; ,换句话说,一个以倍数-开头的字符串,然后是一个或多个空格和一个",以一对{{1}结尾}和(),包含"cola(或两者)。

它将在文件中的每个位置查找匹配,并且对于每个位置,如果它不匹配,它将转到交替的第二部分,即colb(任何)。所以最后,它将匹配整个文件,但如果它匹配一些连接的列,捕获组将包含一些东西,然后通过替换.中写入文件中 第二个替换只是重新格式化保留的行。

备注

  • 我可以通过一次替换来实现,但会更多 难看。
  • 可能很奇怪,我不得不删除最后需要保留的文本并重写它。原因是Notepad ++不允许lookbehinds具有未定义的大小。
  • 根据文件的大小,第一次替换可能需要更多时间用于示例。我不知道Notepad ++在花费太多时间时会如何反应,但它可能会崩溃......如果是这样的话,我们将不得不将这个过程分成多个较小的替换。