oracle正则表达式贪婪行为

oracle正则表达式贪婪行为,oracle,regex-greedy,Oracle,Regex Greedy,--(贪婪)这是来自oracle正则表达式袖珍参考书 在本例中: select regexp_substr('In the beginning','.+[[:space:]]') from dual; 输出:在 这个示例显示了oracle表达式的贪婪性,因为regexp引擎确实希望找到更多,它将查看它是否能够匹配更长的字符 但在第二个例子中: select regexp_substr('bbb',b|bb') from dual; 产出:b 为什么它不在这里显示它的第一个行为?你能解释一下

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

select regexp_substr('In the beginning','.+[[:space:]]') from dual;
输出:在
这个示例显示了oracle表达式的贪婪性,因为regexp引擎确实希望找到更多,它将查看它是否能够匹配更长的字符


但在第二个例子中:

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

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

oracle忽略了“可能的最长匹配”规则,因为计算所有可能的排列和确定哪一个是最长的排列的开销可能过大,但在第一个示例中,为什么要计算可能的最长匹配?

对“已编写”(来自上一段)的解释是bs(一个专业术语,如果您不熟悉,请不要担心)

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

在使用备选方案的搜索中,首先以所有可能的方式将输入字符串与第一个备选方案进行匹配。只有在输入字符串中的任何位置未找到匹配项时,才会尝试第二个备选方案。例如,请参见(注意工作中的贪婪):

编辑

然而,如果你只在第二个备选方案中进行贪婪匹配,但第一个备选方案找到了匹配,那么贪婪永远不会起作用。关键是,“备选方案中的第一个在第二个之前”比“贪婪”具有更高的优先级

“是书面的”(从你的最后一段)的解释是bs(一个技术术语,如果你不熟悉它,不要担心)

贪婪是指将一个匹配模式与基本字符串相匹配。在第二个示例中,有两个匹配模式“b”和“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