2

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

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

所以,我试图比较两者:

1)LIKE万一,我们有%并且可以使用_

所以,我跑:

SELECT 'true' 
  FROM dual 
 WHERE 'true' like '%ru_'; 

我会按预期在输出中得到“真”;

2)在 REGEXP 情况下,如果我运行:

SELECT 'true' 
  FROM dual WHERE REGEXP_LIKE('true', '[[:alpha:]]');

或者

SELECT 'true' 
  FROM dual WHERE REGEXP_LIKE('true', 'u');

在任何一种情况下,我都会在结果集中得到“真”。我希望regexp_like根据正则表达式匹配整个字符串,而不是在给定示例中只匹配一个字符;

我也希望以例如

SELECT 'true' 
  FROM dual WHERE REGEXP_LIKE('true', '[[:alpha:]]');

成为

SELECT 'true' 
  FROM dual 
 WHERE REGEXP_LIKE('true', '[[:alpha:]]+'); 

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

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

编辑:附加说明:

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

ALTER TABLE CUSTOMERS ADD CONSTRAINT cust_f_name CHECK(REGEXP_LIKE(cust_first_name, '^A-Z'))NOVALIDATE; 

B.

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

C。

ALTER TABLE CUSTOMERS ADD CONSTRAINT cust_f_name CHECK(REGEXP_LIKE(cust_first_name, '[[:alpha:]]'))NOVALIDATE; 

D.

ALTER TABLE CUSTOMERS ADD CONSTRAINT cust_f_name CHECK(REGEXP_LIKE(cust_first_name, '[[:digit:]]'))NOVALIDATE;

他们将 C 列为正确,但没有一个是正确的。

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

4

1 回答 1

6

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

如果要强制匹配整个值,请将^和添加$到模式的开始/结束:

SELECT 'true' 
FROM dual 
WHERE REGEXP_LIKE('true', '^[[:alpha:]]{4}$')
于 2013-10-21T06:33:07.687 回答