Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于SQL查询代码中多行搜索和替换的正则表达式_Sql_Regex_Search_Replace_Multiline - Fatal编程技术网

用于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

互联网上有很多关于“使用正则表达式搜索和替换”主题的合格文档。其中只有少数几个演示了如何在多行上下文中执行此操作。甚至很少有人展示如何为其中的几个项目生成正则表达式

我整天都在尝试编辑器中的可安装正则表达式工具(EditPad Pro、RJ TextED、EmEditor、Notepad++、Sublime Text 3、Visual Studio Professional 2019、最新JetBrains PHPstorm版本等)和在线正则表达式服务(正则表达式101、正则表达式R),阅读StackOverflow上与我的标题标准相对应的答案,并尝试充分利用各种在线教程

你说我愚蠢,但我一直无法理解以下概念是否可行

我要更改的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
图例:

  • op.OP1OPVerfahren
    是执行的第一次手术的数据库字段,可以记录10次手术操作(
    OP1OPVerfahren
    直到
    OP10OPVerfahren
  • p.Testzwecke
    是患者个人数据的连接,如名字、姓氏等
  • ods39.dat_optherapie
    是数据库中的表
    dat_optherapie
    -该系统由50个结构完全相同的MySQL数据库组成
  • p.ID
    仅仅是患者的ID
  • op.revision
    是一个自动递增的跟踪器,用于记录同一外科手术中已保存的数据记录集的数量(有时需要精度上的修订)
查询的上述部分具有相关的数量复杂性:在查询中,此段在以下变化中出现780次:

    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中工作