REGEXP_LIKE奇怪的行为

use*_*927 1 regex oracle

我开始对REGEXP_LIKE功能进行一些研究,这是我在oracle网站上发现的:

REGEXP_LIKE类似于LIKE条件,除了REGEXP_LIKE执行常规>表达式匹配而不是LIKE执行的简单模式匹配

所以,我试着比较两者:

1)LIKE如果我们拥有%_可以使用;

所以,我跑:

SELECT 'true' 
  FROM dual 
 WHERE 'true' like '%ru_'; 
Run Code Online (Sandbox Code Playgroud)

我会按预期在输出中得到"真实";

2)在REGEXP案例中,如果我运行:

SELECT 'true' 
  FROM dual WHERE REGEXP_LIKE('true', '[[:alpha:]]');
Run Code Online (Sandbox Code Playgroud)

要么

SELECT 'true' 
  FROM dual WHERE REGEXP_LIKE('true', 'u');
Run Code Online (Sandbox Code Playgroud)

在任何一种情况下,我都会在结果集中得到"真实".我希望regexp_like根据regexp匹配整个字符串,而不是只匹配给定示例中的一个字符;

我也希望以此为例

SELECT 'true' 
  FROM dual WHERE REGEXP_LIKE('true', '[[:alpha:]]');
Run Code Online (Sandbox Code Playgroud)

成为

SELECT 'true' 
  FROM dual 
 WHERE REGEXP_LIKE('true', '[[:alpha:]]+'); 
Run Code Online (Sandbox Code Playgroud)

这意味着[[:alpha:]]可以多次应用令牌,这将与reg exp匹配.如果没有+*,[[:alpha:]]令牌只匹配一个只有"t"的字符,并且由于只需要一个匹配,它将不再匹配失败匹配的任何字符.

对我来说这是一种奇怪的行为.如果我错了,请纠正我.谢谢.

编辑:附加说明:

为什么我首先开始研究它的问题是确保名字不包含任何数字,但只是字母和练习考试会给出以下答案:
A.

ALTER TABLE CUSTOMERS ADD CONSTRAINT cust_f_name CHECK(REGEXP_LIKE(cust_first_name, '^A-Z'))NOVALIDATE; 
Run Code Online (Sandbox Code Playgroud)

B.

ALTER TABLE CUSTOMERS ADD CONSTRAINT cust_f_name CHECK(REGEXP_LIKE(cust_first_name, '^[0-9]'))NOVALIDATE;
Run Code Online (Sandbox Code Playgroud)

C.

ALTER TABLE CUSTOMERS ADD CONSTRAINT cust_f_name CHECK(REGEXP_LIKE(cust_first_name, '[[:alpha:]]'))NOVALIDATE; 
Run Code Online (Sandbox Code Playgroud)

D.

ALTER TABLE CUSTOMERS ADD CONSTRAINT cust_f_name CHECK(REGEXP_LIKE(cust_first_name, '[[:digit:]]'))NOVALIDATE;
Run Code Online (Sandbox Code Playgroud)

他们列出C是正确的,但没有一个是正确的.

根据下面的答案看起来正确可能如下:'^ [[:alpha:]] + $'

Boh*_*ian 5

如果模式匹配值的任何部分,则正则表达式比较为true .

如果要强制匹配到整体价值,增加^$对模式的开始/结束:

SELECT 'true' 
FROM dual 
WHERE REGEXP_LIKE('true', '^[[:alpha:]]{4}$')
Run Code Online (Sandbox Code Playgroud)