簡體   English   中英

ORacle SQL正則表達式

[英]ORacle SQL Regular Expressions

我想為一些測試創建一些正則表達式代碼。 在下面,我創建了一個電子郵件地址的約束檢查。

     create table testemail (username varchar2(50) NOT NULL,
     Password varchar(15) Not NULL,
     CONSTRAINT pk_usertest PRIMARY KEY (username),
     CONSTRAINT un_emailtest CHECK (REGEXP_LIKE(username,'^([[:alnum:]]+)@[[:alnum:]]+.(com|net|org|edu|gov|mil)$'))

在新用戶創建帳戶時,是否有更好的方法進行約束檢查?

此外,我正在嘗試以“Luke Haire”的名義搜索用戶,但我的下面的SQL查詢沒有返回任何結果:

 select * from customers where regexp_like (name, '^([L(u|i|o)ke]+)[\][Haire]$');

我真的不明白你的第一個問題。 檢查約束是檢查約束的最佳方法。 這就是數據庫支持它的原因。 有更糟糕的方法,例如觸發器,但通常最好的方法是使用這種內置的標准功能。

您的具體約束似乎過於受限制。 電子郵件地址通常包含“。” 和“ - ”。

至於第二個問題,問題是后綴。 所以嘗試:

select *
from customers
where regexp_like(name, '^([L(u|i|o)ke]+)[\][Haire]@.*$');
---------------------------------------------------^

我應該補充一點,我更喜歡上面的等價物:

where regexp_like(name, '^([L(u|i|o)ke]+)[\][Haire]@');

問題是likeregexp之間的區別。 like總是匹配整個字符串。 所以,在大多數情況下,我更喜歡讓正則表達式通過顯式開頭和結尾來模擬它。 這是為了避免混淆。 我使用更簡單的搜索和更復雜的正則表達式。

但是,根據檢查約束,我仍然期望這不會得到匹配,因為\\@之前不是允許的字符。

您的查詢不會返回任何行,因為您的模式中有兩個錯誤。

第二個預期字符,根據你的模式是\\所以在字符列表[\\]你應該添加空格[\\ ][\\[:space:]] 您缺少[Haire]角色列表的量詞。 目前您的模式如下:

regexp_like ('Luke Haire', '^([L(u|i|o)ke]+)[\](H|a|i|r|e)$')

您的輸入字符串的一種可能模式是:

 regexp_like (name, '^([L(u|i|o)ke]+)[\ ][Haire].*$')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM