我有一个数据库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 stats column (cola,colbxx)
之类的列组合,且只有cola
是一个连接列 - 也会选择该列,因为其中一个列是连接列"\s*([^"]+ strong\s*)\)
)以消除无关的字符。 答案 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
(任何)。所以最后,它将匹配整个文件,但如果它匹配一些连接的列,捕获组将包含一些东西,然后通过替换.
中写入文件中
第二个替换只是重新格式化保留的行。
备注强>