oracle正则表达式贪心行为

oracle regular expression Greediness behaviour

--(Greediness) 这是出自oracle正则表达式袖珍参考书。
在这个例子中:

select regexp_substr('In the beginning','.+[[:space:]]') from dual;

输出:在
这个例子显示了 oracle 表达式的贪婪,因为正则表达式引擎确实想要找到更多,它看它是否可以匹配更长的 运行 个字符。


但在第二个例子中:

select regexp_substr('bbb',b|bb') from dual;

输出:b

为什么它不在这里显示它的第一个行为?你能解释一下吗?

据说 oracle 忽略了 "longest match possible" 规则,因为计算所有可能的排列并确定哪个是最长的排列的开销可能过大,但是为什么它在第一个示例中计算可能的最长匹配?

"was written"(来自你的最后一段)是bs(专业术语,不熟悉也不用担心)的解释。

贪心是指将一个匹配模式与基本字符串匹配。在第二个例子中,有两个匹配模式,'b' 和 'bb',它们以 ALTERNATIVES 的形式给出:匹配第一个模式或第二个模式。两种匹配模式都是完全确定的,它们中的任何一个都没有附加 "greediness"。在处理过程中,一旦在输入字符串中找到第一个或第二个 "match pattern",搜索就会停止。在这种情况下 'b' 首先匹配,因此搜索结束。 (而且,如果您好奇的话,'bbb' 中的第一个 b 就是匹配并返回的那个。)

在使用替代项进行搜索时,首先以所有可能的方式将输入字符串与第一个替代项进行匹配。只有在输入字符串中的任何地方都找不到匹配项时,才会尝试第二种选择。参见示例(并注意工作中的贪婪):

SQL> select regexp_substr('bbb', 'b+|bb') as res from dual;

RES
---
bbb

编辑

但是,如果您仅在第二个备选方案中进行贪婪匹配,但第一个备选方案找到匹配项,则贪婪永远不会发挥作用。重点是 "FIRST before SECOND in an alternation" 比 "greediness".

有更高的优先级
SQL> select regexp_substr('bbb', 'b|b*') as res from dual;

RES
---
b