2013-10-21 19 views
1

我開始做一點研究REGEXP_LIKE功能,這裏是我在Oracle網站上找到:REGEXP_LIKE奇怪的行爲

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根據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; 

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作爲正確的,但他們都不是正確的。

看起來像正確可能是由於以下根據下面的答案:「^ [[:阿爾法:]] + $」,如果模式匹配值的任何部分

+0

我真的不明白你的問題,你問爲什麼是不是它像這樣的正則表達式''^ u $''(這意味着確切的字符串'u')? –

+0

我仍然不確定是否理解你的問題,但如果匹配不爲空,則regexp_like將評估爲true嘗試查詢以查看區別'SELECT REGEXP_substr('true','^ u $'),REGEXP_substr(' true','u') FROM dual;' –

+0

我同意你的意見。沒有一個答案是正確的。正如你所說的,正確的正則表達式應該是'^ [[:alpha:]] + $' –

回答

5

正則表達式比較結果爲真。

如果要強制匹配到整個值,添加^$的模式的開始/結束:

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

A.B.Cade和Bohemian,就是這樣,你們把我推向了正則表達式分析的正確方向。它現在確實有意義。 – user2901927