gpt4 book ai didi

regex - 为什么非贪婪量词有时在 Oracle 正则表达式中不起作用?

转载 作者:行者123 更新时间:2023-12-02 03:53:14 32 4
gpt4 key购买 nike

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,。为什么?

<小时/>

更新1:

在正则表达式中使用 Perl 风格的元字符需要 Oracle 10.2+。

更新2:

我的问题的更清晰形式(以避免有关 Oracle 版本和 Perl 样式正则表达式扩展的可用性的问题):

在同一个系统上,为什么非贪婪量词有时按预期工作,有时却不然?

这可以正常工作:

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

这不起作用:

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

Fiddle

更新3:

是的,这似乎是一个错误。

Oracle 支持人员对此问题有何 react ?

该错误是否已知?有ID吗?

最佳答案

这是一个错误!

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

您偶然发现了 Oracle Database 11g R2 中仍然存在的一个错误。如果完全相同的正则表达式原子(包括量词但不包括贪婪修饰符)在正则表达式中出现两次,则两次出现都将具有第一次出现指示的贪婪性,无论第二次出现指定的贪婪性如何。这些结果清楚地证明了这是一个错误(此处,“完全相同的正则表达式原子”是 [^B]*):

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

GOOD
--------
A=1,B=2,

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

BAD
-----------
A=1,B=2,C=3,

这两个正则表达式之间的唯一区别是“好”正则表达式排除“x”作为第二个匹配列表中的可能匹配项。由于“x”没有出现在目标字符串中,因此排除它应该没有什么区别,但正如您所看到的,删除“x”会产生很大的差异。这一定是一个错误。

以下是 Oracle 11.2 中的更多示例:( SQL Fiddle with even more examples )

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

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

关于regex - 为什么非贪婪量词有时在 Oracle 正则表达式中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16702672/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com