加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么非贪心量词有时在Oracle regex中不工作?

发布时间:2020-12-12 14:10:33 所属栏目:百科 来源:网络整理
导读:IMO,此查询应返回A = 1,B = 2, SELECT regexp_substr('A=1,B=2,C=3,','.*B=.*?,') as A_and_B FROM dual 但它返回整个字符串A = 1,B = 2,C = 3。为什么? UPD:Oracle 10.2需要在正则表达式中使用Perl样式的元字符。 UPD2: 更清晰的我的问题(避免关于O
IMO,此查询应返回A = 1,B = 2,
SELECT regexp_substr('A=1,B=2,C=3,','.*B=.*?,') as A_and_B FROM dual

但它返回整个字符串A = 1,B = 2,C = 3。为什么?

UPD:Oracle 10.2需要在正则表达式中使用Perl样式的元字符。

UPD2:
更清晰的我的问题(避免关于Oracle版本和Perl风格的regex扩展的可用性的问题):
为什么在同一系统非贪心量词有时工作如预期和有时不?

这项工作正常:

regexp_substr('A=1,'B=.*?,')

这不工作:

regexp_substr('A=1,')

fiddle

UPD3:
是的,它似乎是一个错误。
任何人都可以提供Oracle Support对此问题的反应?
是已知的bug?
它有ID吗?

这是一个BUG!

你是对的,在Perl,’A = 1,B = 2,C = 3,’=?/.*B=.*?,/; print $&打印A = 1,B = 2,

您所遇到的是Oracle Database 11g R2中仍然存在的错误。如果完全相同的正则表达式运算符(不包括贪心修改符)在正则表达式中出现两次,则两个出现都将具有由第一个外观指示的贪婪,而不管第二个外观指定的贪心程度。这是一个错误,这些结果清楚地表明:

SQL> SELECT regexp_substr('A=1,'[^B]*B=[^Bx]*?,') as good FROM dual;

GOOD
--------
A=1,SQL> SELECT regexp_substr('A=1,'[^B]*B=[^B]*?,') as bad FROM dual;

BAD
-----------
A=1,

两个正则表达式之间的唯一区别是“good”将“x”排除在第二个匹配列表中的可能匹配。因为’x’不出现在目标字符串中,排除它不应该有什么区别,但是你可以看到,删除’x’有很大的区别。这必须是一个错误。

下面是Oracle 11.2中的一些示例:(SQL Fiddle with even more examples)

SELECT regexp_substr('A=1,')  FROM dual; =>  A=1,SELECT regexp_substr('A=1,'.*B=.*,')   FROM dual; =>  A=1,'.*?B=.*?,') FROM dual; =>  A=1,'.*?B=.*,-- Changing second operator from * to +
SELECT regexp_substr('A=1,'.*B=.+?,'.*B=.+,'.+B=.+,'.+?B=.+,

模式是一致的:第一次出现的贪婪被用于第二次出现,无论它是否应该。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读