REGEXP_LIKE奇怪的行为

时间:2013-10-21 06:09:11

标签: regex oracle

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

  

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

执行的简单模式匹配

所以,我试着比较两者:

1)在LIKE案例中,我们可以使用%_;

所以,我跑:

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

我会按预期在输出中得到'true';

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

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

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

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

我也希望以例如

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

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

这意味着可以多次应用[[:alpha:]]令牌,这将使得与reg exp匹配成为真。如果没有+*[[:alpha:]]令牌只会匹配一个字符“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;

℃。

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:]] + $'

1 个答案:

答案 0 :(得分:5)

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

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

SELECT 'true' 
FROM dual 
WHERE REGEXP_LIKE('true', '^[[:alpha:]]{4}$')