我開始做一點研究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作爲正確的,但他們都不是正確的。
看起來像正確可能是由於以下根據下面的答案:「^ [[:阿爾法:]] + $」,如果模式匹配值的任何部分
我真的不明白你的問題,你問爲什麼是不是它像這樣的正則表達式''^ u $''(這意味着確切的字符串'u')? –
我仍然不確定是否理解你的問題,但如果匹配不爲空,則regexp_like將評估爲true嘗試查詢以查看區別'SELECT REGEXP_substr('true','^ u $'),REGEXP_substr(' true','u') FROM dual;' –
我同意你的意見。沒有一個答案是正確的。正如你所說的,正確的正則表達式應該是'^ [[:alpha:]] + $' –