You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle SQL regexp_replace非贪婪正则运算符使用问题咨询

问题分析与解决方案

这个问题其实是Oracle正则引擎里非贪婪量词的一个常见“坑”,不过很容易修正。

直接解决方案

把正则里的.*?换成[^"]*,就能得到你预期的456:

select regexp_replace('abc:"123", def:"456", hji="789", dasdjaoijdsa', '(^.*def:")([^"]*)(".*$)', '\2') from dual;

为什么原来的.*?没生效?

虽然.*?是非贪婪量词,但在Oracle的正则实现中,当它后面跟着".*$这种需要匹配到字符串结尾的模式时,引擎会为了让整个正则表达式完全匹配(因为你用了^和$锚定了整个字符串),而回溯并让.*?匹配更长的内容——直到找到最后一个能让后续".*$匹配的双引号,这就导致它意外表现出了贪婪的行为。

而[^"]*是更精确的写法:它明确表示匹配任意不是双引号的字符,会精准停在def:"之后的第一个双引号前,完美符合你的需求。

补充:为什么第一个例子正常?

第一个例子的正则^ab.*?c没有锚定到结尾,.*?c只需要找到从ab开始到第一个c的最短匹配,所以引擎直接停在第一个c,非贪婪行为正常工作。

内容的提问来源于stack exchange,提问作者devoured elysium

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:19:16