微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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=.+,

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

原文地址:https://www.jb51.cc/oracle/206739.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐