用于SQL查询代码中多行搜索和替换的正则表达式
互联网上有很多关于“使用正则表达式搜索和替换”主题的合格文档。其中只有少数几个演示了如何在多行上下文中执行此操作。甚至很少有人展示如何为其中的几个项目生成正则表达式 我整天都在尝试编辑器中的可安装正则表达式工具(EditPad Pro、RJ TextED、EmEditor、Notepad++、Sublime Text 3、Visual Studio Professional 2019、最新JetBrains PHPstorm版本等)和在线正则表达式服务(正则表达式101、正则表达式R),阅读StackOverflow上与我的标题标准相对应的答案,并尝试充分利用各种在线教程 你说我愚蠢,但我一直无法理解以下概念是否可行 我要更改的SQL查询部分如下所示:用于SQL查询代码中多行搜索和替换的正则表达式,sql,regex,search,replace,multiline,Sql,Regex,Search,Replace,Multiline,互联网上有很多关于“使用正则表达式搜索和替换”主题的合格文档。其中只有少数几个演示了如何在多行上下文中执行此操作。甚至很少有人展示如何为其中的几个项目生成正则表达式 我整天都在尝试编辑器中的可安装正则表达式工具(EditPad Pro、RJ TextED、EmEditor、Notepad++、Sublime Text 3、Visual Studio Professional 2019、最新JetBrains PHPstorm版本等)和在线正则表达式服务(正则表达式101、正则表达式R),阅读St
AND op.OP1OPVerfahren > 0
AND p.Testzwecke = 0
AND NOT EXISTS (SELECT DISTINCT 1 FROM ods39.dat_optherapie op2 WHERE op2.patID = p.ID AND op2.revision > op.revision)
UNION ALL
图例:
是执行的第一次手术的数据库字段,可以记录10次手术操作(op.OP1OPVerfahren
直到OP1OPVerfahren
)OP10OPVerfahren
是患者个人数据的连接,如名字、姓氏等p.Testzwecke
是数据库中的表ods39.dat_optherapie
-该系统由50个结构完全相同的MySQL数据库组成dat_optherapie
仅仅是患者的IDp.ID
是一个自动递增的跟踪器,用于记录同一外科手术中已保存的数据记录集的数量(有时需要精度上的修订)op.revision
AND **op.OP1OPVerfahren** _up_to_ **op.OP10OPVerfahren** > 0
AND p.Testzwecke = 0
AND NOT EXISTS (SELECT DISTINCT 1 FROM **ods01.dat_optherapie** _up_to_ **ods39.dat_optherapie** op2 WHERE op2.patID = p.ID AND op2.revision > op.revision)
UNION ALL
为了充分理解我想在这里解决的问题,我想用以下表达式替换前面提到的表达式:
AND **op.OP1OPVerfahren** _up_to_ **op.OP10OPVerfahren** > 0
AND p.Testzwecke = 0
AND NOT EXISTS (SELECT DISTINCT 1 FROM **ods01.dat_optherapie** _up_to_ **ods39.dat_optherapie** op2 WHERE op2.patID = p.ID AND op2.revision > op.revision)
GROUP BY **OP1OPVerfahren** _up_to_ **OP10OPVerfahren**
UNION ALL
第一行的op.op_x_OPVerfahren
(x=1到10)和GROUP BY
语句中的op_x_OPVerfahren
(x=1到10)在数字上相互关联,即。E当我想将替换程序从39个数据库的op.op1opferfahren
更改为39个数据库的op.op2opferfahren
,以此类推时,分组编号应相应更改
现在,应对所有39个数据库进行替换。整个SQL查询代码大约有20.000行代码——这就是我不想花几个小时手动替换的原因,因为不同的文件中有更多这样的SQL查询结构,需要以类似的方式替换
举个例子:
代码
AND op.OP1OPVerfahren > 0
AND p.Testzwecke = 0
AND NOT EXISTS (SELECT DISTINCT 1 FROM ods39.dat_optherapie op2 WHERE op2.patID = p.ID AND op2.revision > op.revision)
UNION ALL
。。。在39个数据库ods01
到ods39
的联合之前,需要通过OP1OPVerfahren
扩展组。然后对相同的39个数据库再次使用op.OP2OPVerfahren
和OP2OPVerfahren
,直到最后达到(op.)OP10OPVerfahren
(=780次替换)
新插入的GROUP BY
语句的OP\u x\u…
计数应与OP.OP\u x\u…
编号相同
我已经尝试了大量不同的正则表达式语句(如\d\d、(\d)(\d)、\d{2},以及根据我使用的上述编辑器的个人需要而使用的许多其他语句),但我无法找到如何根据数据库中的“数字检测”ods\u x\u数据治疗仪
)
我将非常感谢您最宝贵的经验和专业知识的帮助,我也将非常感谢您以良好的(甚至是可测试的)态度为上述编辑以外的其他人提供进一步的建议正则表达式处理。我相信下面的正则表达式查找/替换表达式可以满足您的要求:
查找:
和op.op(\d{1,2})(OPVerfahren.*?\)
替换为:
和op.op$1$2\n按op$1OPVerfahren分组
注意,它需要为正则表达式设置“全局”和“点匹配换行”选项
简单地说,这有两个捕获组,一个用于op.op和OPVerfahren之间的数字,第二个用于捕获之后的所有内容,直到“(选择不同…)的结束括号。然后,在正则表达式的替换部分中,它们被用作$1和$2
测试示例。我相信这应该在记事本++中工作
(顺便说一句,我认为您的“GROUP ByOP1Verfahren”应该是“GROUP ByOP1OPVerfahren”,对吗?也就是说,有两个“OP”!我们可以使用正则表达式替换如下:
(AND\ +op\.(OP\d0?OPVerfahren)\ *>\ *0\s+AND\ +p\.Testzwecke\ *=\ *0\s+AND\ +NOT\ +EXISTS\ *\(SELECT\ +DISTINCT\ +1\ +FROM\ +ods[0123][0-9]\.dat_optherapie\ +op2\ +WHERE\ +op2\.patID\ *=\ *p\.ID\ +AND\ +op2\.revision\ *>\ *op\.revision\))(\s+UNION\s+ALL)
它与原始字符串非常紧密,并且大多数情况下只为空白字符引入可变长度的量词。当存在\*
时,如果必须使用空格,则可能会出现可选空格\+
。否则,使用空白速记字符\s
不仅允许空格,还允许换行等。要使其正常工作,请启用s | singleline标志(或在模式前面添加(?s)
)。沿这些线添加什么?是的,谢谢,它就像一个盒子里的符咒。我不得不对它进行一些改进,因为我忽略了在ods39
前面有一条小注释,指示切换到新的OP_x_OPVerfahren
,但这没有问题。你帮我省下了大量繁琐的手工编辑时间!我如何评价你的评论是解决方案?是的,你在括号中的评论是绝对正确的,我已经相应地编辑了我的问题。非常感谢你的解决方案。经过一点修改后,它在EditPad Pro中工作