Regex 记事本++;复杂条件搜索正则表达式

Regex 记事本++;复杂条件搜索正则表达式,regex,replace,conditional,notepad++,Regex,Replace,Conditional,Notepad++,我有一个数据库SQL,后面跟着一堆语句来收集统计数据。我想在SQL中搜索一个特定的连接,找到所有相应的collect statistics语句,然后修改它们以删除无关字符,最后提取一组有用的语句Input select tbd.cola , tba.a, tbx.b, tbc.r, tbx.c , ca

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

          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.
我想做的是:

  • 搜索正在加入的列名
    ,例如tbd.cola=tba.colb
  • 然后在collect statistics语句中查找这些列名,因此在我们的例子中
    cola colp colm colfff
    它们是否连接来自的列名

    tbd在tbd.cola=tba.colb上加入tba
    左连接
    tbx上的tbx.colp=tba.colp左连接
    tbc上的tbc.colfff=tbx.colm

    我们在collect stats语句和下面的

    ——“收集tbd上的统计列(cola、colbxx)(中等强度)”
    ----“收集tbc上的统计列(colfff)(非强)”

  • 接下来,必须对语句进行“净化”,以便删除em周围的无关字符和文字。理想的输出格式如下

    收集tbd上的统计列(cola、colbxx)
    
    收集tbc上的统计列(colfff)
    
    删除
    ----“
    模式
    [-]+?”

    (非强)
    格式的
    ()“
    替换为


我所做的是多步骤的过程。我可以使用
“\s*([^”]+strong\s*)\)

这就像完成了一样,但我在这里寻找一种条件选择方法。需要前两位的帮助。
不需要使用边界来选择collect stats语句。我可以使用鼠标选择该部分,然后仅在所选部分中使用正则表达式
逻辑是

  • 搜索
    join\s*tablename.column\s*\=\s*tablename.column
    模式。
    \=
    已转义
    =
  • 将所有匹配的列名收集到缓冲区中
  • 然后创建边界或物理选择collect statistics语句开始的部分
  • 在collect stats语句中运行select列列表,查看符合条件的语句。 如果有一个列组合,如
    collect stats column(cola,colbxx)
    ,并且只有
    cola
    是一个联接列,则也会选择该列,因为其中一个em col是联接列
  • 最后,我们有一个入围的collect statistics语句组,在该语句组上运行最后一个正则表达式(logic
    “\s*([^”]+strong\s*)\)
    ),以除去无关字符
  • 我们可以将此操作分为两个部分。第一部分是条件搜索。在“收集统计信息”区域中搜索合并的列名。搜索结果被复制并粘贴到另一个工作区(一个新文件),然后我们在这个选定的文件上运行上面的最后一部分
      好的,我找到了!它适用于您给出的示例,但我无法预测所有的可能性,因此请告诉我它是否适用于您。

      它使用2个替换。确保选中了正则表达式,并选中它旁边的框(类似“.匹配新行”)

      第一次替换:
      替换此:
      在\s+\w+\.(\w+)\b\s*=\s*\w+\.(\w+)\b(?=.-+\s+)([^“]+(?:\1|124;\ 2)[^“]+)(\s)+\([^)]+\”)\124;

      通过此:
      \3\4


      第二次替换:
      替换此:
      (collect.*?)\s+(on\s\w+)\s

      通过此:
      `\1 \2;\n


      演示

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


      解释

      正则表达式基于一个替换。第一部分是
      在\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
      匹配这样构建的字符串:join tbname on tbname.cola=tbname.colb。请注意,
      =
      周围的空格是可选的,cola和colb的名称将被捕获以备将来使用。

      (?=.-+\s+”([^“]+(?:\1|2)[^“]+)(\s)+\([^)]+\)
      仅当文件后面有一个字符串类似于--“[…][cola或colb][…]([…]),或者换句话说,一个以倍数开头的字符串
      -
      ,然后是一个或多个空格和一个
      ,最后是一对
      ,并包含
      cola
      colb
      (或两者兼有)。

      它将在文件中的每个位置查找类似的匹配项,对于每个位置,如果不匹配,将转到替换的第二部分,即
      (任意项)。因此,最终,它将匹配整个文件,但如果它匹配一些连接的列,则捕获组将包含一些内容,然后通过替换
      \3\4


      第二个替换只是对保留的行重新格式化


      注释

      • 我可以用一个替代品来做,但要多得多 丑陋的
      • 这可能很奇怪,我不得不删除需要保留在最后的文本并重写它。原因是Notepad++不允许lookbehinds具有未定义的大小
      • 根据文件的大小,第一次替换可能比示例中的要花费更多的时间。我不知道记事本++在花费太多时间时会有什么反应,但它可能会崩溃。。。如果是这样的话,我们将不得不把这个过程分成多个更小的替代品

      我要寻找一些东西,但这应该是一个挑战^^^只有一件事:你能在最后添加一个你想要的例子吗(我不是