正则表达式的 Oracle 数据库查询没有给出正确的结果

Oracle db query for regex is not giving correct result

我正在使用 Oracle 数据库并且 table

-----------------------------
ID   :  NAME
------------------------------

现在我需要知道有多少名字符合以下条件

  1. 可以包含 A 到 Z
  2. 可以包含 a 到 z
  3. 可以包含_

我已经写了查询

SELECT *
FROM REGEX_TEST
WHERE  REGEXP_LIKE (name,'[A-Za-z0-9_]')

但这并没有给我正确的结果

我想要的示例结果

ID  Text          Expected result
1   PLAN_20001    PASS
2   A937AH        PASS
3   556679815     PASS
4   A93_7AH       PASS
5   PLANavd20001  PASS
6   A93*7AH       FAIL
7   A93%7AH       FAIL
8   A93^7AH       FAIL
9   A93AH    FAIL
10  A93@7AH       FAIL
11  A93!7AH       FAIL
12  A93~7AH    FAIL
13  A93+7AH       FAIL

//------------ 结果 ----------

1   PLAN20001
2   A937AH
3   556679815
4   A93 7AH
5   PLANavd20001
6   A93*7AH
7   A93%7AH
8   A93^7AH
9   A93AH
10  A93@7AH
11  A93!7AH
12  A93~7AH
13  A93+7AH

目前您的模式匹配名称中的任何字符;它只会排除根本不包含任何这些范围的值,而不是您似乎想要排除包含其他任何内容的值。因此,您需要使用 ^ 和 $ 来锚定模式,并使用 * 或 ? 添加量词以允许重复模式。所以模式变成 '^[A-Za-z0-9_]*$'.

使用 CTE 来表示示例数据的演示:

WITH REGEX_TEST (id, name) AS (
  select 1, 'PLAN20001' from dual
  union all select 2,'A937AH' from dual
  union all select 3, '556679815' from dual
  union all select 4, 'A93 7AH' from dual
  union all select 5, 'PLANavd20001' from dual
  union all select 6, 'A93*7AH' from dual
  union all select 7, 'A93%7AH' from dual
  union all select 8, 'A93^7AH' from dual
  union all select 9, 'A93AH' from dual
  union all select 10, 'A93@7AH' from dual
  union all select 11, 'A93!7AH' from dual
  union all select 12, 'A93~7AH' from dual
  union all select 13, 'A93+7AH' from dual
)
SELECT *
FROM REGEX_TEST
WHERE REGEXP_LIKE (name, '^[A-Za-z0-9_]*$');

        ID NAME       
---------- ------------
         1 PLAN20001   
         2 A937AH      
         3 556679815   
         5 PLANavd20001

尽管你说了两次你只想要字母和下划线,但我还是保留了 0-9 的数字范围,因为你对 David Aldridge 的回复说你也想要数字。

您也可以使用字母数字 class 而不是您的范围,这样可以更安全地处理其他语言(当然取决于您要匹配的内容):

WHERE REGEXP_LIKE (name, '^[[:alnum:]_]*$');

Perl-influenced \w 运算符:

WHERE REGEXP_LIKE (name, '^\w*$');

或者不需要锚定的非词运算符:

WHERE NOT REGEXP_LIKE (name, '\W');