gpt4 book ai didi

java - 正则表达式替换匹配后出现的所有匹配项

转载 作者:行者123 更新时间:2023-11-30 02:40:47 24 4
gpt4 key购买 nike

我希望删除以下语句中 ORDER BY 后面的 upper 关键字:

select upper(a.col1), b.col1
from a join
b
on a.q = b.q
order by upper(a.col1), upper(b.col1)

期望的输出:

select upper(a.col1), b.col1
from a join
b
on a.q = b.q
order by (a.col1), (b.col1)

我尝试过lookbehind或简单的https://regex101.com/r/sfhDpt/1但它只匹配一个实例。

上下文是 SQL 转换 - 原始 SQL 在 MSSQL 或 Oracle 中工作,但在 DB2 或 H2 中不起作用,因此我需要一种简单的方法(读取、正则表达式)在需要时进行转换。

这可以用一个正则表达式来完成吗?

最佳答案

这样的正则表达式应该做到这一点(perl 语法):

s/(order by)((.*?)upper)*/$1$3/s

它利用了第三组的重复匹配。 test

编辑:不幸的是,上面的方法不适用于超过 2 个 upper 字符串,因为重复匹配组仅捕获最后一次出现的情况。要在 perl 中捕获所有这些,可以这样写:

s/(order by)(?{$x=""})((.*?)(?{$x.=$3})upper)*/$1$x/s

捕获 $x 变量中所有 $3 的出现。这在正则表达式中使用 perl 代码执行,并且在 pcre 中不起作用(尽管 callouts 可以用于调用外部函数来执行类似的操作)诡计)。 test

当然,重复也可以像这样手动展开:

s/(order by)((.*?)upper)?((.*?)upper)?((.*?)upper)?((.*?)upper)?/$1$3$5$7$9/s

但在这种情况下,((.*?)upper)? 必须重复(连同替换变量),次数与源代码中 upper 发生的次数一样多字符串。 test

关于java - 正则表达式替换匹配后出现的所有匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41780186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com