首页 > 解决方案 > 为什么不能在 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

标签: regexoracleoracle11gregexp-like

解决方案


将右方括号放在正则表达式中,不要转义:

SELECT 1
FROM   dual
WHERE  regexp_like( 'R23]', '^[]0-9a-zA-Z]+$');

你也想a-z而不是a_z

Oracle 文档

用于指定匹配列表的括号表达式,该列表应匹配列表中表示的任何一个表达式。不匹配的列表表达式以抑扬符 ( ^) 开头,并指定与列表中表示的表达式以外的任何字符匹配的列表。

要在方括号表达式中指定右方括号 ( ]),请将其放在列表的第一个位置(如果有的话,在初始的抑扬符 ( ^) 之后)。

要在括号表达式中指定连字符,请将其放在列表的第一个位置(在初始的抑扬符 ( ^) 之后,如果有的话)、最后一个或作为范围表达式中的结束范围点。

您的表情(更正_为后-):

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

db<>小提琴


推荐阅读