regex - 为什么不能在 oracle 中将 ']' 的字符与 regexp_like 匹配?
问题描述
当我输入这些 SQL 时,它们返回结果1
:
sql 1:
select 1 from dual where regexp_like('R[23','^[[0-9a_zA-Z]+$');
返回1
sql 2:
select 1 from dual where regexp_like('[]','^\\[\\]$');
返回1
但是当我输入这个 SQL 时,它不能返回结果1
sql 3:
select 1 from dual where regexp_like('R23]','^[0-9a_zA-Z\\]]+$');
返回null
解决方案
将右方括号放在正则表达式中,不要转义:
SELECT 1
FROM dual
WHERE regexp_like( 'R23]', '^[]0-9a-zA-Z]+$');
你也想a-z
而不是a_z
。
用于指定匹配列表的括号表达式,该列表应匹配列表中表示的任何一个表达式。不匹配的列表表达式以抑扬符 (
^
) 开头,并指定与列表中表示的表达式以外的任何字符匹配的列表。要在方括号表达式中指定右方括号 (
]
),请将其放在列表的第一个位置(如果有的话,在初始的抑扬符 (^
) 之后)。要在括号表达式中指定连字符,请将其放在列表的第一个位置(在初始的抑扬符 (
^
) 之后,如果有的话)、最后一个或作为范围表达式中的结束范围点。
您的表情(更正_
为后-
):
SELECT 1
FROM DUAL
WHERE regexp_like('R23]','^[0-9a-zA-Z\\]]+$');
正在匹配以查看是否存在与0123456789abcdefghiklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\\
字符串开头的字符之一匹配的字符(正则表达式中没有转义字符,因此\
被视为要匹配的字符组的一部分),然后是一个 -或多个]
字符,然后是字符串的结尾。
所以:
SELECT 1
FROM DUAL
WHERE regexp_like('\]]]]]]]]]]','^[0-9a-zA-Z\\]]+$');
输出1
推荐阅读
- visual-studio - 如何在 Visual Studio 扩展中检测非托管 C++ 项目
- python-3.x - 如何在多维数组上使用收集计数器?
- vim - 如何根据缓冲区中已找到的单词使 Vim 自动完成单词?
- ajax - 使用多个标签表将数据提交到谷歌表
- javascript - 如果 else 不能正常工作
- c# - 如何使用 NSwag 和 C# 指定“方案”元素?
- python - 使用 os.expanduser (python) 后查找文件目录
- android - ScrollView 后的 FrameLayout 始终位于底部
- maven - lein 尝试下载工件,即使它存在于本地
- css - Opencart 3.0.2.0 自定义布局