我开始对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:]] + $'
如果模式匹配值的任何部分,则正则表达式比较为true .
如果要强制匹配到整体价值,增加^和$对模式的开始/结束:
SELECT 'true'
FROM dual
WHERE REGEXP_LIKE('true', '^[[:alpha:]]{4}$')
Run Code Online (Sandbox Code Playgroud)