Regex 记事本++;复杂条件搜索正则表达式
我有一个数据库SQL,后面跟着一堆语句来收集统计数据。我想在SQL中搜索一个特定的连接,找到所有相应的collect statistics语句,然后修改它们以删除无关字符,最后提取一组有用的语句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
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)
是一个联接列,则也会选择该列,因为其中一个em col是联接列cola
- 最后,我们有一个入围的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 tbname on tbname.cola=tbname.colb。请注意,join\s+\w+\s+on\s+\w+\.(\w+)\b\s*=\s*\w+\.(\w+)\b
周围的空格是可选的,cola和colb的名称将被捕获以备将来使用。=
仅当文件后面有一个字符串类似于--“[…][cola或colb][…]([…]),或者换句话说,一个以倍数开头的字符串(?=.-+\s+”([^“]+(?:\1|2)[^“]+)(\s)+\([^)]+\)
,然后是一个或多个空格和一个-
,最后是一对”
,
,
,并包含”
或cola
(或两者兼有)。colb
它将在文件中的每个位置查找类似的匹配项,对于每个位置,如果不匹配,将转到替换的第二部分,即
(任意项)。因此,最终,它将匹配整个文件,但如果它匹配一些连接的列,则捕获组将包含一些内容,然后通过替换\3\4
第二个替换只是对保留的行重新格式化
注释
- 我可以用一个替代品来做,但要多得多 丑陋的
- 这可能很奇怪,我不得不删除需要保留在最后的文本并重写它。原因是Notepad++不允许lookbehinds具有未定义的大小
- 根据文件的大小,第一次替换可能比示例中的要花费更多的时间。我不知道记事本++在花费太多时间时会有什么反应,但它可能会崩溃。。。如果是这样的话,我们将不得不把这个过程分成多个更小的替代品