-(贪婪)这来自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