oracle正则表达式贪婪的行为



-(贪婪)这来自oracle正则表达式袖珍参考书
在本例中:

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

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


但在第二个例子中:

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

输出:b

为什么它没有在这里表现出它的第一个行为?你能解释一下吗?

有人写道,oracle忽略了"可能的最长匹配"规则,因为计算所有可能的排列和确定哪一个最长的开销可能会过大,但为什么在第一个例子中计算可能的最短匹配呢?

"was writted"(来自上一段)的解释是bs(一个技术术语,如果您不熟悉,请不要担心)。

贪婪是指将一个匹配模式与基本字符串相匹配。在第二个例子中,有两个匹配模式,"b"one_answers"bb",它们被作为备选方案给出:匹配第一个模式或第二个模式。两种匹配模式都是完全确定的,其中任何一种都没有"贪婪"。在处理过程中,一旦在输入字符串中找到第一个或第二个"匹配模式",搜索就会停止。在这种情况下,首先匹配"b",因此搜索结束。(如果你好奇的话,"bbb"中的第一个b就是匹配并返回的。)

在具有备选方案的搜索中,首先以所有可能的方式将输入字符串与第一个备选方案相匹配。只有在输入字符串的任何位置都找不到匹配项的情况下,才会尝试第二种选择。例如(注意工作中的贪婪):

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

编辑

然而,如果你只在第二个选项中进行贪婪匹配,但第一个选项找到了匹配,贪婪就永远不会发挥作用。重点是"交替中的第一个在第二个之前"比"贪婪"有更高的优先级。

SQL> select regexp_substr('bbb', 'b|b*') as res from dual;
RES
---
b

最新更新