我在 Oracle SQL 中测试了一个正则表达式,发现了一些我无法理解的东西:
-- NO MATCH
SELECT 1 FROM DUAL WHERE REGEXP_LIKE ('Professor Frank', '(^|\s)Prof[^\s]*(\s|$)');
Run Code Online (Sandbox Code Playgroud)
以上不匹配,而以下匹配:
-- MATCH
SELECT 1 FROM DUAL WHERE REGEXP_LIKE ('Professor Frank', '(^|\s)Prof\S*(\s|$)');
Run Code Online (Sandbox Code Playgroud)
在其他正则表达式中,它会像\bProf[^\s]*\bvs\bProf\S*\b并且具有相似的结果。注意:Oracle SQL 正则表达式没有\b或字边界。
问:为什么不[^\s]*和\S*工作中的Oracle SQL以同样的方式?
我注意到如果我(\s|$)在最后删除,第一个正则表达式将匹配。
在 Oracle 正则表达式中,\s确实是空格的转义序列,但不在匹配的字符集中(即[.....], 或[^....]用于排除一个字符)。在匹配的字符集中,只有两个字符具有特殊含义,-用于范围和]关闭集合枚举。他们无法逃脱;如果在匹配集中需要,]必须始终是开头之后的第一个字符[(它是结尾]代表自己作为字符的唯一位置,并且不表示匹配集的结尾),并且-必须是第一个或最后(最好始终将其保留在匹配集的末尾)- 在其他任何地方都将其视为范围标记。包括(或排除,如果使用[^.....] 语法)一个空格,只需在匹配集中键入一个实际的物理空间。
编辑:我上面说的并不完全正确。匹配集中还有另一个特殊字符,即^. 如果它用在第一个位置,则表示“匹配除以外的任何字符”。在任何其他位置,它代表自己。例如,'[^^]'将匹配任何单个字符 OTHER THAN ^(第一个^具有特殊含义,第二个代表自身)。并且,]如果它是方括号中的第二个字符,如果第一个字符是^(具有其特殊含义),则右方括号代表自身。也就是说,要匹配 OTHER THAN 之外的任何单个字符],我们可以使用匹配模式'[^]]'。
| 归档时间: |
|
| 查看次数: |
1741 次 |
| 最近记录: |