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,')
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=.+,
模式是一致的:第一次出现的贪婪被用于第二次出现,无论它是否应该。