为什么非贪心量词有时在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: 这项工作正常: regexp_substr('A=1,'B=.*?,') 这不工作: regexp_substr('A=1,') fiddle UPD3: 你是对的,在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=.+, 模式是一致的:第一次出现的贪婪被用于第二次出现,无论它是否应该。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |