譚玉玲
(羅定職業(yè)技術(shù)學(xué)院電子信息工程系,廣東羅定 527200)
隨著數(shù)據(jù)庫技術(shù)的不斷發(fā)展,數(shù)據(jù)庫中存儲(chǔ)的數(shù)據(jù)量越來越大,數(shù)據(jù)處理工作也越來越復(fù)雜。數(shù)據(jù)庫中的操作大都是通過數(shù)據(jù)庫管理系統(tǒng)(DBMS)提供的標(biāo)準(zhǔn)SQL語句來實(shí)現(xiàn)的。為了提高數(shù)據(jù)處理效率,人們提出了很多優(yōu)化方法,如建立視圖,減少LIKE條件的使用等[1-3]。這些優(yōu)化方法都是建立在標(biāo)準(zhǔn)SQL語句基礎(chǔ)之上的。而標(biāo)準(zhǔn)SQL語句在執(zhí)行復(fù)雜的操作時(shí),本身就存在著一些不足。例如,要從好友聯(lián)系表Table中查詢滿足條件“QQ號(hào)字段中以10、11、12開頭,以8結(jié)尾”的所有好友記錄,則可以使用如下的標(biāo)準(zhǔn)SQL語句進(jìn)行查詢:
上述SQL語句采用謂詞LIKE的方式來進(jìn)行模式匹配,檢索條件明確,運(yùn)行后可以得到正確的結(jié)果,但是語句卻顯得有點(diǎn)冗長。語句中的百分號(hào)(%)可代表任意多個(gè)字符。如果要對(duì)QQ號(hào)字段的長度進(jìn)行限制,就勢(shì)必會(huì)增加SQL語句的復(fù)雜度。如果僅僅使用標(biāo)準(zhǔn)的SQL語句執(zhí)行查詢操作,不僅難以編寫復(fù)雜的查詢語句,還可能會(huì)降低程序的查詢效率。更為糟糕的是,一旦SQL語句出錯(cuò),難以進(jìn)行排查和改錯(cuò)。
實(shí)際上,對(duì)于模式匹配,正則表達(dá)式提供了更高效且更佳的解決方案。運(yùn)用正則表達(dá)式強(qiáng)大的模式匹配功能,可以通過簡單的語句實(shí)現(xiàn)匹配工作,完成復(fù)雜的數(shù)據(jù)處理。
正則表達(dá)式是一種源于Unix的強(qiáng)大的數(shù)據(jù)檢索技術(shù),它是由普通字符(如a~z之間的字母)和特殊字符(稱為“元字符”)組成,不僅允許用戶對(duì)檢索條件有更靈活的控制,而且對(duì)電話號(hào)碼、email地址和文件名等規(guī)范格式也非常有用[4-6]。正則表達(dá)式是定義復(fù)雜查詢的一個(gè)強(qiáng)有力工具,它定義一個(gè)字符串的規(guī)則,使用了某些特殊的語法結(jié)構(gòu),能夠匹配更多的字符串。
熟練運(yùn)用正則表達(dá)式的特殊字符,可以對(duì)字符串執(zhí)行許多復(fù)雜而高級(jí)的操作,可以實(shí)現(xiàn):
(1)測試字符串的模式。如可以對(duì)用戶輸入的字符串進(jìn)行測試,看該字符串是否為一串?dāng)?shù)字。
(2)查找。根據(jù)模式匹配從字符串中提取子字符串,可以用來在文本或輸入字段中查找特定文字,這也是最常見的操作。
(3)替換文本。在文檔中使用一個(gè)正則表達(dá)式來表示特定文字,然后可以將其全部刪除,或者替換為別的文字。在SQL語句中,要使用正則表達(dá)式強(qiáng)大的模式功能,需要借助SQL中新引入的一些謂詞。使用SQL提供的謂詞REGEXP_LIKE和正則表達(dá)式中的某些特殊字符,則上述查詢QQ號(hào)字段的操作可通過下面的SQL語句完成:
可見,通過引入正則表達(dá)式,原先的SQL語句被大大簡化了。除了上面使用的謂詞REGEXP_LIKE之外,SQL還提供了其他3個(gè)謂詞,分別是REGEXP_INSTR、REGEXP_SUBSTR 和 REGEXP_REPLACE。它們的用法和SQL中的一般謂詞INSTR、SUBSTR和REPLACE相似。由于它們是用正則表達(dá)式代替一般謂詞中的通配符“%”和“_”,因此模式匹配功能要強(qiáng)大得多。如果對(duì)上述的QQ號(hào)查詢操作再加以條件限制:要求QQ號(hào)以10、11、12開頭,以8結(jié)尾,且號(hào)碼長度不超過8位數(shù)字,使用標(biāo)準(zhǔn)的SQL語句,完成這樣的查詢工作幾乎不可能,但是如果使用正則表達(dá)式,則查詢語句十分簡單,如下所示:
由于正則表達(dá)式在模式匹配方面的強(qiáng)大優(yōu)勢(shì),很多大型數(shù)據(jù)庫軟件廠商的產(chǎn)品,如Oracle公司的 Oracle 10g、微軟的 SQL Server 2005、IBM公司的DB2都開始支持正則表達(dá)式的使用[7-8]。
下面以O(shè)racle 10g平臺(tái)下開發(fā)使用的學(xué)員信息管理系統(tǒng)為例,詳細(xì)介紹正則表達(dá)式在數(shù)據(jù)庫操作中的應(yīng)用。
首先,要建立學(xué)員信息數(shù)據(jù)庫表,該數(shù)據(jù)庫包含的字段信息有用戶名、密碼、QQ號(hào)、email和學(xué)習(xí)卡號(hào)。為了能夠更詳細(xì)地掌握學(xué)員的信息,學(xué)習(xí)卡號(hào)的數(shù)據(jù)應(yīng)符合如下格式:**-****-****(*代表數(shù)字0~9)。其中,前兩位數(shù)字表示該學(xué)員的入學(xué)年份,中間的4位數(shù)字表示該學(xué)員所在城市的區(qū)號(hào),后4位數(shù)字表示學(xué)員的序號(hào)。如學(xué)習(xí)卡號(hào)08-0731-1024表示是08年長沙地區(qū)序號(hào)為1024的學(xué)員。
具體的SQL語句如下:
本研究通過對(duì)我院收治的40例兒茶酚胺增多癥患者臨床資料的回顧性分析,可知了解兒茶酚胺增多癥患者的自身狀況,及時(shí)進(jìn)行針對(duì)性手術(shù)治療,能夠取得較好效果,值得臨床推廣。
在上面的SQL語句中,正則表達(dá)式REGEXP_LIKE(stucard,′^([[:digit:]]{2}- [[:digit:]]{3,4}- [[:digit:]]{4})$ ′)給出了判斷學(xué)習(xí)卡號(hào)stucard是否符合規(guī)定的實(shí)現(xiàn)細(xì)節(jié),即stucard是由任意兩個(gè)數(shù)字開頭,后接連字符“-”,再接3位或4位任意數(shù)字,隨后又是連字符“-”和任意4位數(shù)字,最后符號(hào)“$”為結(jié)尾符。其中,表達(dá)式中的[[:digit:]]完成匹配數(shù)字0~9的任務(wù),表達(dá)式{2},{3,4},{4}用來控制數(shù)字需要重復(fù)的次數(shù)。如果stucard字段的格式判斷由標(biāo)準(zhǔn)SQL語句來實(shí)現(xiàn),將會(huì)十分困難。
完成數(shù)據(jù)庫表創(chuàng)建工作后,就可以插入學(xué)員記錄。以插入兩條學(xué)員記錄為例,相應(yīng)的SQL語句如下:
以上插入記錄的stucard字段都符合規(guī)定格式,因此,能夠正確插入到數(shù)據(jù)庫表中。但是如果執(zhí)行下面兩條插入數(shù)據(jù)記錄的操作:
由于第一條記錄stucard中025只包含3個(gè)數(shù)字,第二條記錄stucard中01只包含2個(gè)數(shù)字,格式不合規(guī)定,會(huì)導(dǎo)致錯(cuò)誤提示,插入記錄后的錯(cuò)誤提示界面圖如圖1所示。
在創(chuàng)建數(shù)據(jù)庫表的時(shí)候,并沒有給出用戶名、密碼、email等字段的約束條件。但在實(shí)際應(yīng)用中,這些字段也要符合相應(yīng)的規(guī)則[9-10],可以通過正則表達(dá)式設(shè)計(jì)的匹配模式來實(shí)現(xiàn)這些規(guī)則。設(shè)計(jì)匹配模式,首先要定義構(gòu)成規(guī)則,然后再利用正則表達(dá)式的語法進(jìn)行描述。下面給出上述幾種字段的匹配模式的設(shè)計(jì)。
圖1 插入記錄后的錯(cuò)誤提示界面圖
(1)用戶名的匹配模式。若用戶名的構(gòu)成規(guī)則是至少4個(gè)字符或漢字,至多20個(gè)字符或漢字,則匹配模式為“^.{4,10}$”。
(3)email的匹配模式。一個(gè)合理的email地址至少要滿足以下條件:①包含一個(gè)且只有一個(gè)符號(hào)“@”;②“@”前至少有一個(gè)字符,且首字符只能是字母、數(shù)字和下劃線,后面的字符可以是字母、數(shù)字和下劃線,也可以是減號(hào)或圓點(diǎn)。若包含減號(hào)或圓點(diǎn),則不能有兩個(gè)或兩個(gè)以上相鄰,且后面必須有字符(字母、數(shù)字和下劃線);③“@”后至少有一個(gè)字符,且首字符只能是字母或數(shù)字,后面的字符可以是字母或數(shù)字,也可以是圓點(diǎn)或減號(hào)。若包含圓點(diǎn)或減號(hào),則不能有兩個(gè)或兩個(gè)以上相鄰,且后面必須有字符(字母或數(shù)字);④最后要由圓點(diǎn)后跟至少一個(gè)字符(字母或數(shù)字)結(jié)尾。
根據(jù)上述原則,利用正則表達(dá)式的語法,可以得到如下模式匹配:“^w+((-w+)|(.w+))*@[A-Z a-z 0-9]+((.|-)[A-Z a-z 0-9]+)*.[A-Z a-z 0-9]+$”。
基于上述匹配模式,可以創(chuàng)建觸發(fā)器來進(jìn)行數(shù)據(jù)操作的控制。筆者以創(chuàng)建用戶名和email觸發(fā)器為例,給出具體的SQL語句:
(1)基于用戶名匹配模式的觸發(fā)器創(chuàng)建。
觸發(fā)器創(chuàng)建后,當(dāng)插入記錄時(shí),首先判斷REGEXP_LIKE的返回值是否為真,如果返回值為假,表示輸入數(shù)據(jù)的格式不符合規(guī)定,就會(huì)觸發(fā)執(zhí)行相應(yīng)的SQL語句并提示錯(cuò)誤。
如當(dāng)分別插入下面兩條記錄,記錄1的用戶名“l(fā)il”只包含3個(gè)字符,記錄 2的 email地址“l(fā)ucyyahoo.com.cn”沒有包含字符@,因此會(huì)導(dǎo)致觸發(fā)器cs1和cs2被分別觸發(fā)執(zhí)行,運(yùn)行結(jié)果如圖2所示。
圖2 觸發(fā)器執(zhí)行結(jié)果
正則表達(dá)式是一種用來進(jìn)行字符串模式匹配的強(qiáng)有力工具。將其應(yīng)用于標(biāo)準(zhǔn)SQL語句中,不僅可以實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)處理操作,而且還簡化了SQL語句的復(fù)雜度,使對(duì)出錯(cuò)語句的修改工作變得更加簡單方便。
通過正則表達(dá)式在學(xué)員管理系統(tǒng)中的數(shù)據(jù)處理應(yīng)用,給出了詳細(xì)的語法規(guī)則和實(shí)現(xiàn)細(xì)節(jié),對(duì)提高數(shù)據(jù)處理的效率和簡化數(shù)據(jù)處理的復(fù)雜度,具有較大的實(shí)用價(jià)值和參考價(jià)值。
[1]王振輝,吳廣茂.SQL查詢語句優(yōu)化研究[J].計(jì)算機(jī)應(yīng)用,2005(12):207-208.
[2]陳怡,卿峰.在C語言中使用正則表達(dá)式[J].華南金融電腦,2004(4):57-58.
[3]李村和,孫運(yùn)雷.正則表達(dá)式在Oracle中的應(yīng)用與實(shí)現(xiàn)[J].微計(jì)算機(jī)應(yīng)用,2005(2):240-242.
[4]GONZALO N,MATHIEU R.New techniques for regular expression searching[J].Algorithmica,2005,11(41):89-116.
[5]YU F,CHEN Z F,DIAO Y L,et al.Fast and memory-efficient regular expression matching for deep packet inspetion[C]∥Proc of the 2006 ACM/IEEE Symposium on Architecture for Networking and Communications Systems.San Jose:ACM/IEEE,2006:93-102.
[6]陳立娜.面向制造業(yè)的主動(dòng)搜索平臺(tái)的研究與實(shí)現(xiàn)[J].現(xiàn)代計(jì)算機(jī),2009,3(2):56-58.
[7]白琳.正則表達(dá)式在動(dòng)態(tài)網(wǎng)頁開發(fā)中的應(yīng)用[J].湖南科技學(xué)院學(xué)報(bào),2009,30(2):47-49.
[8]王燕,李冬梅.基于正則表達(dá)式的協(xié)議識(shí)別方案[J].教育技術(shù)導(dǎo)刊,2009(2):30-32.
[9]王琳琳.基于HTML解析器的Web信息提取技術(shù)[J].鄭州輕工業(yè)學(xué)院學(xué)報(bào):自然科學(xué)版,2008(6):25-29.
[10]李文鵬..Dot Net正規(guī)表達(dá)式應(yīng)用研究[J].教育技術(shù)導(dǎo)刊,2009(1):36-38.