- (贪婪)这是来自oracle正则表达式的口袋参考书。
在这个例子中:
select regexp_substr('In the beginning','.+[[:space:]]') from dual;
输出:在 这个例子显示了oracle表达式的贪婪,因为regexp引擎确实想要找到更多,它看起来是否可以匹配更长的字符运行。
但在第二个例子中:
select regexp_substr('bbb',b|bb') from dual;
输出:b
为什么它没有在这里显示它的第一个行为?你能解释一下吗?
有人写道,oracle忽略了“可能的最长匹配”规则,因为计算所有可能的排列并确定哪个最长的开销可能过多但是为什么在第一个例子中计算最长匹配的原因呢?
答案 0 :(得分:2)
“已写入”(来自您的最后一段)的解释是bs(技术术语,如果您不熟悉,请不要担心)。
贪婪是指将一个匹配模式与基本字符串匹配。在第二个例子中,有两种匹配模式,'b'和'bb',它们作为ALTERNATIVES给出:匹配第一个模式或第二个模式。两种匹配模式都是完全确定的,其中任何一种都没有“贪婪”。在处理过程中,只要在输入字符串中找到第一个或第二个“匹配模式”,搜索就会停止。在这种情况下,首先匹配'b',因此搜索结束。 (而且,如果你很好奇,'bbb'中的第一个b是匹配并返回的那个。)
在使用替代方案的搜索中,首先以所有可能的方式将输入字符串与FIRST替代方案进行匹配。只有在输入字符串中的任何位置找不到匹配项时,才会尝试第二种方法。例如,参见(并注意工作中的贪婪):
SQL> select regexp_substr('bbb', 'b+|bb') as res from dual;
RES
---
bbb
修改强>
但是,如果你只在SECOND替代品中有贪婪匹配,但FIRST替代方案找到匹配,贪婪永远不会发挥作用。关键是“在交替中的第二个之前的第一个”比“贪婪”具有更高的优先级。
SQL> select regexp_substr('bbb', 'b|b*') as res from dual;
RES
---
b