gpt4 book ai didi

sql - Oracle REGEXP_LIKE 未按预期工作

转载 作者:行者123 更新时间:2023-12-03 16:15:48 28 4
gpt4 key购买 nike

我在 Oracle SQL 中测试了一个正则表达式,发现了一些我无法理解的东西:

-- NO MATCH
SELECT 1 FROM DUAL WHERE REGEXP_LIKE ('Professor Frank', '(^|\s)Prof[^\s]*(\s|$)');

以上不匹配,而以下匹配:
-- MATCH
SELECT 1 FROM DUAL WHERE REGEXP_LIKE ('Professor Frank', '(^|\s)Prof\S*(\s|$)');

在其他正则表达式中,它会像 \bProf[^\s]*\b\bProf\S*\b并有类似的结果。注意:Oracle SQL 正则表达式没有 \b或字边界。

问题:为什么不 [^\s]*\S*在 Oracle SQL 中以相同的方式工作?

我注意到我是否删除了 (\s|$)最后,第一个正则表达式将匹配。

最佳答案

在 Oracle 正则表达式中,\s确实是空格的转义序列,但不在匹配的字符集中(即 [.....][^....] 用于排除一个字符)。在匹配的字符集中,只有两个字符具有特殊含义,-对于范围和 ]用于关闭集合枚举。他们无法逃脱;如果匹配集中需要,]必须始终是开头之后的第一个字符 [ (它是结束 ] 代表自己作为字符的唯一位置,并不表示匹配集的结尾),和 -必须是第一个或最后一个(最好始终将其保留在匹配集的末尾)- 在其他任何地方都将其视为范围标记。要包含(或排除,如果使用 [^.....] 语法)一个空格,只需在匹配集中键入一个实际的物理空间。

编辑 : 我上面说的并不完全正确。匹配集中还有一个特殊字符,即^ .如果它用在第一个位置,则表示“匹配除以外的任何字符”。在任何其他位置,它代表自己。例如,'[^^]'将匹配除 ^ 之外的任何单个字符(第一个 ^ 有特殊含义,第二个代表自己)。并且,一个右括号 ]如果它是括号中的第二个字符,则代表它自己,如果第一个字符是 ^ (具有特殊含义)。也就是说,匹配除 ] 之外的任何单个字符,我们可以使用匹配模式 '[^]]' .

关于sql - Oracle REGEXP_LIKE 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39904854/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com