❶ 在ms sql中如何使用正則表達式,請給出簡單示例,注釋越詳細越好!感激不盡
MSSQL不支持正則表達式,可以用CLR實現。
1、新建一個MSSQL的資料庫項目,配置到你的資料庫中
2、在資料庫項目中新建一個函數庫,編寫如下代碼:
///<summary>
///驗證是否符合正則表達式
///</summary>
[SqlFunction]
(stringinput,stringregex)
{
returnnewSqlBoolean(Regex.IsMatch(input,regex,RegexOptions.IgnoreCase));
}
然後在資料庫項目上點擊「右鍵」,選擇「部署」
PS:此功能需要MSSQL2005或者以上版本支持
如果你使用的是.NET3.5版本的話,需要在資料庫伺服器上安裝.netframework3.5
目前SQLSERVERCLR不支持.NET4.0,所以如果你使用VS2010開發的話需要把項目版本修改成為.NET2.0/3.5
使用方法:
SELECT*FROM[table]WHEREdbo.RegexIsMatch([ID],'^d+$')=1
❷ sql 實現正則表達式
沒有正則表達式LIKE
確定給定的字元串是否與指定的模式匹配。模式可以包含常規字元和通配符字元。模式匹配過程中,常規字元必須與字元串中指定的字元完全匹配。然而,可使用字元串的任意片段匹配通配符。與使用 = 和 != 字元串比較運算符相比,使用通配符可使 LIKE 運算符更加靈活。如果任何參數都不屬於字元串數據類型,Microsoft® SQL Server™ 會將其轉換成字元串數據類型(如果可能)。
語法
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]
參數
match_expression 任何字元串數據類型的有效 SQL Server 表達式。
patternmatch_expression 中的搜索模式,可以包含下列有效 SQL Server 通配符
1 % 包含零個或更多字元的任意字元串
示例:WHERE title LIKE '%computer% ' 將查找處於書名任意位置的包含單詞 computer 的所有書名。
2 _(下劃線) 任何單個字元
示例:WHERE au_fname LIKE '_ean ' 將查找以 ean 結尾的所有 4 個字母的名字(Dean、Sean 等)。
3 [] 指定范圍中的任何單個字元
示例:WHERE au_lname LIKE '[C-P]arsen ' 將查找以arsen 結尾且以介於 C 與 P 之間的任何單個字元開始的 作者姓氏,例如,Carsen、Larsen、Karsen 等
4 [^] 不屬於指定范圍中的任何單個字元,與 [] 相反
示例:WHERE au_lname LIKE 'de[^l]% ' 將查找以 de 開始且其後的字母不為 l 的所有作者的姓氏。
一 使用 like 的模式匹配:
在搜索Datetime類型時,建議使用like .
LIKE 支持 ASCII 模式匹配和 Unicode 模式匹配。當所有參數,包括 match_expression、pattern 和 escape_character(如果有)都是 ASCII 字元數據類型時,將執行 ASCII 模式匹配。如果其中任何參數屬於 Unicode 數據類型,則所有參數將被轉換為 Unicode 並執行 Unicode 模式匹配。當對 Unicode 數據(nchar 或 nvarchar 數據類型)使用 LIKE 時,尾隨空格是有意義的。但是對於非 Unicode 數據,尾隨空格沒有意義。Unicode LIKE 與 SQL-92 標准兼容。ASCII LIKE 與 SQL Server 的早期版本兼容
二 使用 % 通配符
例如,此查詢將顯示資料庫中所有的系統表,因為它們都以字母 sys 開始:
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'sys% '
若要查閱非系統表的所有對象,請使用 NOT LIKE 'sys% '。如果共有 32 個對象且 LIKE 找到 13 個與模式匹配的名稱,則 NOT LIKE 將找到 19 個與 LIKE 模式不匹配的對象
三 使用escape字句的模式匹配
可搜索包含一個或多個特殊通配符的字元串。例如,customers 資料庫中的 discounts 表可能存儲含百分號 (%) 的折扣值。若要搜索作為字元而不是通配符的百分號,必須提供 ESCAPE 關鍵字和轉義符。例如,一個樣本資料庫包含名為 comment 的列,該列含文本 30%。若要搜索在 comment 列中的任何位置包含字元串 30% 的任何行,請指定由 WHERE comment LIKE '%30!%% ' ESCAPE '! ' 組成的 WHERE 子句。如果不指定 ESCAPE 和轉義符,SQL Server 將返回所有含字元串 30 的行。
下例使用 ESCAPE 子句和轉義符查找 mytbl2 表的 c1 列中的精確字元串 10-15%
USE pubs
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'mytbl2 ')
DROP TABLE mytbl2
GO
USE pubs
GO
CREATE TABLE mytbl2
(
c1 sysname
)
GO
INSERT mytbl2 VALUES ( 'Discount is 10-15% off ')
INSERT mytbl2 VALUES ( 'Discount is .10-.15 off ')
GO
SELECT c1
FROM mytbl2
WHERE c1 LIKE '%10-15!% off% ' ESCAPE '! '
GO
四 使用 [] 通配符
下例查找姓為 Carson、Carsen、Karson 或 Karsen 的作者所在的行。
USE pubs
SELECT au_lname, au_fname, phone
FROM authors
WHERE au_lname LIKE '[CK]ars[eo]n '
ORDER BY au_lname ASC, au_fname ASC
❸ oracle SQL 正則表達式
正則表達式已經在很多軟體中得到廣泛的應用,包括*nix(Linux, Unix等),HP等操作系統,PHP,C#,Java等開發環境。
本文主要介紹了關於Oracle中正則表達式的使用方法,下面話不多說了,來一起看看詳細的介紹。
Oracle使用正則表達式離不開這4個函數:regexp_like、regexp_substr、regexp_instr、regexp_replace。
1、regexp_like
該函數只能用於條件表達式,和 like 類似,但是使用的正則表達式進行匹配
2、regexp_substr
該函數和 substr 類似,用於拾取合符正則表達式描述的字元子串
3、regexp_instr
該函數和 instr 類似,用於標定符合正則表達式的字元子串的開始位置
4、regexp_replace
該函數和 replace 類似,用於替換符合正則表達式的字元串
❹ sql 正則表達式匹配
當我們要進行一些簡單的糊塗查詢時用百分號(%),通配符(_)就可以了.其中%表達任意長度的字元串,_表示任意的某一個字元.
比如
select*fromempwhereenamelike's%'orenamelike's_';
但如果在一些復雜的查詢中關用這兩個符號sql語句就會非常復雜,而且也不一定能實現.從Oracle 10g開始引入了在其他程序語言中普通使用的正則表達式.
主要有regexp_like,regexp_replace,regexp_substr,regexp_instr四個正則表達式函數.
正則表達式中的元字元:
元字元 意思 例子
說明要匹配的字元是一個特殊字元、常量或者後者引用。(後引用重復上一次的匹配)
匹配換行符
\ 匹配
匹配(匹配 )
^ 匹配字元串的開頭位置 ^a匹配arwen.但不匹配barwen.
$ 匹配字元串的末尾位置 en$匹配arwen.但不匹配arwenb.
* 匹配前面的字元0次或多次 a*rwen可以匹配rwen或aaarwen.
+ 匹配前面的字元1次或多次 a+rwen可以匹配arwen或aarwen.但不能匹配rwen.
? 匹配前面的字元0次或1次 a?rwen可以匹配arwen或rwen.但不能匹配aarwen.
{n} 匹配前面的字元恰好是n次,其中n是整數 ar{2}wen可以匹配arrwen.但不能匹配arwen或arrrwen.
{n,m} 匹配前面的字元至少是n次,最多是m次.如果寫成{n,} 表示最少匹配n次.沒有上限.
ar{1,2}wen可以匹配arwen,arrwen.但不匹配awen或arrrwen.
. 點號,匹配除null,換行以外的任意單個字元 arw.n.可以匹配arwen,arwin.但不能匹配arween或arwn.
(pattern) 括弧中pattern是一個子正則表達式,匹配指定pattern模式的一個子表達式。 其實括弧就像一般語言表達式中的括弧.有時多加些括弧可增強可讀性.另外的用處見下面關於 的描述.
x|y 匹配「或」 x|y可以匹配x或者y
[abc] 可以匹配abc中的任何單個字元 hello[abc]可以匹配helloa,hellob,helloc
[a-z] 可以匹配指定范圍內的任何單個字元 hell[a-z]可以匹配hello或者hellz
[::] 指定一個字元類,可以匹配該類中的任何字元 [:alphanum:]可以匹配字元0-9、A-Z、a-z
[:alpha:]可以匹配字元A-Z、a-z
[:blank:]可以匹配空格或tab鍵
[:digit:]可以匹配數字0-9
[:graph:]可以匹配非空字元
[:lower:]可以匹配小寫字母a-z
[:print:]與[:graph:]類似,不同之處在於[:print:]包括空格字元
[:punct:]可以匹配標點符號.,""等等
[:space:]可以匹配所有的空字元
[:upper:]可以匹配大寫字母A-Z
[:xdigit:]可以匹配十六進制數字0-9、A-F、a-f
這是對前一次匹配命中的一個後引用,其中n是一個正整數 arw(en)1可以匹配arwenen.注意1前面必須是個加括弧的子表達式.
regexp_like:
regexp_like(x,pattern[,match_option]),查看x是否與pattern相匹配,該函數還可以提供一個可選的參數match_option字元串說明默認的匹配選項。match_option的取值如下:
『c』 說明在進行匹配時區分大小寫(預設值);
'i' 說明在進行匹配時不區分大小寫;
'n'(.)點號能表示所有單個字元,包括換行(俺還不知道什麼地方有用到換行.只知道sql裡面可以用chr(10)表示換行.
'm' 字元串存在換行的時候當作多行處理.這樣$就可匹配每行的結尾.不然的話$只匹配字元串最後的位置.
示例:select * from emp where regexp_like(ename,'^a[a-z]*n$');可以查找ename中以a開頭以n結尾的行.例如ename為arwen或arwin或anden.但Arwen不能被匹配.因為默認是區分大小寫.如果是select * from emp where regexp_like(ename,'^a[a-z]*n$','i')則可以查找ename為Arwen的行記錄.
2. regexp_instr:
REGEXP_INSTR(x,pattern[,start[,occurrence[,return_option[, match_option]]]])用於在x中查找pattern。返回pattern在x中出現的位置。匹配位置從1開始。可以參考字元串函數 INSTR(),參數相關:
'start' 開始查找的位置;
'occurrence' 說明應該返回第幾次出現pattern的位置;
'return_option' 說明應該返回什麼整數。若該參數為0,則說明要返回的整數是x中的一個字元的位置;若該參數為非0的整數,則說明要返回的整數為x中出現在pattern之後 的字元的位置;
'match_option' 修改默認的匹配設置.與regexp_like裡面的相同.
示例:
DECLARE
V_RESULTINTEGER;
BEGIN
SELECT REGEXP_INSTR('hello world','o',1,1,0)INTO V_RESULT
FROM DUAL;
DBMS_OUTPUT.PUT_LINE(V_RESULT);
END;
結果為5.即字母o第一個次出現的位置
如果regexp_instr('hello world','o',1,1,n)其中n為除0之外的整數.比如1,3.則結果為6.表示第一次出現字母o的後面一個字元的位置.
如果regexp_instr('hello world','o',1,2,0)則結果為9.表示第二次出現字母o的位置.
3. regexp_replace:
REGEXP_REPLACE(x,pattern[,replace_string[,start[,occurrence[, match_option]]]])用於在x中查找pattern,並將其替換為replae_string。可以參考字元串函數 REPLACE(),參數同REGEXP_INSTR函數
示例:
DECLARE
V_RESULT varchar2(90);
BEGIN
SELECT REGEXP_REPLACE('hello world','o','x',1,1)INTO V_RESULT
FROM DUAL;
DBMS_OUTPUT.PUT_LINE(V_RESULT);
END;
結果為hellx world.
如果REGEXP_REPLACE('hello world','o','x'),則結果為hellx wxrld.
如果 REGEXP_REPLACE('hello w
orld','o','x',1,2)則結果為hello wxrld.
4.regexp_substr:
REGEXP_SUBSTR(x,pattern[,start[,occurrence[, match_option]]])用於在x中查找pattern並返回。可以參考字元串函數 SUBSTR(),參數同REGEXP_INSTR函數.
例如:
DECLARE
V_RESULT VARCHAR2(255);
BEGIN
SELECTREGEXP_SUBSTR('hello world','l{2}')INTO V_RESULT
FROM DUAL;
DBMS_OUTPUT.PUT_LINE(V_RESULT);
END;
結果為ll
查詢到匹配的字元串才返回匹配的字元.沒查到就返回空.
❺ SQL Server 2008 R2如何使用正則表達式搜索
使用正則表達式進行查找若要在「快速查找」、「在文件中查找」、「快速替換」或「在文件中替換」 操作過程中,在「查找內容」欄位啟用正則表達式,請在「查找選項」下選中「使用」,再選擇「正則表達式」。「查找內容」欄位旁邊的「引用列表」三角形按鈕將變為可用狀態。單擊此按鈕可顯示一組最常用的正則表達式。如果選擇了表達式生成器中的某個項,則可將該項插入「查找內容」字元串。注意「查找內容」字元串中使用的正則表達式與 Microsoft .NET Framework 編程中的有效正則表達式相比,語法上存在差異。例如,在「查找和替換」對話框中,大括弧 {} 用於表示帶標記的表達式。所以,表達式「zo{1}」將匹配所有「zo」後帶標記 1 的匹配項,如「Alonzo1」和「Gonzo1」。但在 .NET Framework 中,{} 符號用於表示量詞。因此,表達式「zo{1}」將匹配所有「z」後跟一個「o」的匹配項,如匹配「zone」,但不匹配「zoo」。下表對「引用列表」中提供的正則表達式進行了說明。 表達式語法說明任何單個字元.匹配除換行符外的所有單一字元。零個或更多*匹配零或更多前導表達式的匹配項,執行所有可能的匹配。一個或更多+匹配至少一個前導表達式的匹配項。行首^僅匹配行首位置的字元串。行尾$僅匹配行尾位置的字元串。字首<僅匹配文本中以此開頭的字。字尾>僅匹配文本中以此結尾的字。分行符\n匹配與平台無關的換行符。在替換表達式中,插入一個換行符。在集合中的任何一個字元[]匹配[] 中的任何一個字元。若要指定字元范圍,請列出起始字元和結束字元,並用短劃線 (-) 分隔,如 [a-z]。不在集合中的任何一個字元[^...]匹配不在 ^ 之後的字元集中的任何一個字元。或|匹配「或」符號 (|) 兩旁的任一表達式。常用於組中。例如,(sponge|mud) bath 可以匹配「sponge bath」和「mud bath」。Escape\將反斜杠 (\) 後的字元作為文字匹配。此表達式允許您搜索正則表達式標記中使用的符號,如 { 和 ^。例如, \^ 可用於查找字元 ^。標記表達式{}匹配用括起來的表達式內的文本。C/C++ 標識符:i匹配表達式 ([a-zA-Z_$][a-zA-Z0-9_$]*)。用引號括起來的字元串:q匹配表達式 (("[^"]*")|('[^']*'))。空格或製表符:b匹配空格或製表符。整數:z匹配表達式 ([0-9]+)。「引用列表」中只列出了部分可在「查找和替換」操作中使用的正則表達式。還可以將下列任一正則表達式插入「查找內容」字元串: 表達式語法說明最少- 零個或更多@匹配零個或更多前導表達式的匹配項,匹配盡可能少的字元。最少- 一個或更多#匹配一個或更多前導表達式的匹配項,匹配盡可能少的字元。重復n 次^n匹配前導表達式的 n 個匹配項。例如,[0-9]^4 匹配所有四位數序列。分組()將子表達式分組第n 個標記文本\n在「查找或替換」表達式中,指示匹配第 n 個標記表達式的文本,其中 n 為 1 到 9 之間的數字。在「替換」表達式中,\0 將插入完整的匹配文本。右對齊欄位\(w,n)在「替換」表達式中,在寬度至少為 w 個字元的欄位中,右對齊第 n 個標記表達式。左對齊欄位\(-w,n)在「替換」表達式中,在寬度至少為 w 個字元的欄位中,左對齊第 n 個標記表達式。阻止匹配~(X)如果在表達式的此處出現 X,則阻止匹配。例如,real~(ity) 匹配「realty」和「really」中的「real」,但不匹配「reality」中的「real」。字母數字字元:a匹配表達式 ([a-zA-Z0-9])。字母字元:c匹配表達式 ([a-zA-Z])。十進制數字:d匹配表達式 ([0-9])。十六進制數:h匹配表達式 ([0-9a-fA-F]+)。有理數:n匹配表達式 (([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))。字母字元串:w匹配表達式 ([a-zA-Z]+)。Escape\eUnicode U+001B。響鈴\gUnicode U+0007。Backspace\hUnicode U+0008。製表符\t匹配製表符,Unicode U+0009。Unicode 字元\x#### 或 \u####匹配由 Unicode 值確定的字元,其中 #### 為十六進制數字。可以使用 ISO 10646 碼位或給出代理項對值的兩個 Unicode 碼位,指定基本多語言面(即代理項)以外的字元。下表列出了按標准 Unicode 字元屬性匹配時的語法。雙字母縮寫和 Unicode 字元屬性資料庫中列出的縮寫相同。可以將這些縮寫指定為字元集的一部分。例如,表達式 [:Nd:Nl:No] 匹配任何數字。 表達式語法說明大寫字母:Lu匹配任何單個大寫字母。例如,:Luhe 匹配「The」,但不匹配「the」。小寫字母:Ll匹配任何單個小寫字母。例如,:Llhe 匹配「the」,但不匹配「The」。標題大寫字母:Lt匹配一個大寫字母後跟一個小寫字母的字元,例如 Nj 和 Dz。修飾字母:Lm匹配字母或標點符號(如逗號、交叉重音符和秒號),這些字母或標點符號是用於修飾前導字母的。其他字母:Lo匹配其他字母,如歌特字母 ahsa。十進制數字:Nd匹配十進制數字(如 0-9)及其全形對等數字。字母數字:Nl匹配字母數字,如羅馬數字和零的表意數字。其他數字:No匹配其他數字,如舊斜體數字一。左標點:Ps匹配左標點,如左小括弧和左大括弧。右標點:Pe匹配右標點,如右小括弧和右大括弧。左引號:Pi匹配左雙引號。右引號:Pf匹配單引號和右雙引號。劃線號:Pd匹配劃線號。連接號:Pc匹配下劃線符號。其他標點:Po匹配(,)、?、"、!、@、#、%、&、*、\、(:)、(;)、' 和 /。空格分隔符:Zs匹配空格。行分隔符:Zl匹配Unicode 字元 U+2028。段落分隔符:Zp匹配Unicode 字元 U+2029。不佔位標記:Mn匹配不佔位標記。合並標記:Mc匹配合並標記。封閉標記:Me匹配封閉標記。數學符號:Sm匹配+、=、~、|、< 和 >。貨幣符號:Sc匹配$ 和其他貨幣符號。修飾符號:Sk匹配修飾符號,如抑揚符、重音符和長音符。其他符號:So匹配其他符號,如版權符號、段落標記和度數符號。其他控制:Cc匹配行尾。其他格式:Cf格式化控制字元,如雙向控制字元。代理項:Cs匹配代理項對的一半。其他專門用途:Co匹配任何專用區域的字元。其他未分配字元:Cn匹配未映射到 Unicode 字元的字元。除了標準的 Unicode 字元屬性以外,還可以將下列附加屬性指定為字元集的一部分。 表達式語法說明字母:Al匹配任何單字元。例如,:Alhe 匹配「The」、「then」 和「reached」之類的字。Numeric:Nu匹配任何數字。標點:Pu匹配任意一個標點符號,如 ?、@、' 等等。空格:Wh匹配任何類型的空格,包括印刷空格和表意空格。雙向:Bi匹配自右至左書寫的字元,如阿拉伯語和希伯萊語字元。朝鮮文字:Ha匹配朝鮮文字字母和組合字母。平假名:Hi匹配平假名字元。片假名:Ka匹配片假名字元。象形/漢字/日文漢字:Id匹配象形字元,如漢字和日文漢字。用於查找文本的正則表達式Expression Studio 4.0 其他版本 此主題尚未評級 - 評價此主題 通過使用正則表達式,可以在 Microsoft Expression Web 中執行繁復的查找和替換操作。如果您不知道所要查找的確切文本或代碼,或者要查找文本或代碼字元串的多個匹配項,則可以使用正表達式。正則表達式是一種文本模式,它可以描述所要查找的文本的一種或多種變體。正則表達式由特定字元(如字母「a」到「z」)和描述文本模式的特殊字元(如星號「*」)組成。例如,要在網站中查找「page」的所有變體,可以搜索「page*」。這樣,Expression Web 將在網站中查找「page」、「pages」、「pager」以及以「page」開頭的任何其他單詞的所有實例。在搜索中使用正則表達式時,特定的規則將控制哪些字元組合將執行特定的匹配操作。每種正則表達式(或正則表達式的組合)都稱為「語法」。可以在一個語法中使用多個正則表達式以精確匹配要搜索的目標。若要使用正則表達式,請參閱使用查找和替換編輯多個網頁。正則表達式語法 語法表達式說明.任意字元 用作換行符 (\n) 以外的任何單個列印或非列印字元的通配符。例如,正則表達式 c.t 可匹配 cat、c t、cot 等字元串,但不能匹配 cost。在本例中,句點 (.) 是一個代表單個字元的通配符。它出現在字母「c」和「t」之間,因此字元「c」和「t」之間的任何單個字元都與表達式匹配 - 即使是空格也一樣。*最大為零或更多 用於匹配在此表達式之前出現零次或更多次的某個字元,可與盡可能多的字元相匹配。正則表達式 .* 用於匹配某個出現零次或更多次的字元。例如,正則表達式 b.*k 可匹配 book、back、black、blank 和 buck。在本例中,將句點 (.) 和星號 (*) 組合成一個語法。句號 (.) 緊挨在星號 (*) 表達式之前。星號 (*) 可匹配「b」和「k」之間任意出現零次或更多次的字元。句點 (.) 用作「b」和「k」之間字元的通配符。在本例中,它表示「b」和「k」之間的任意字元都可以反復出現。+最大為一或更多 用於匹配在此表達式之前出現一次或更多次的某個字元,可與盡可能多的字元相匹配。正則表達式 .+ 用於匹配某個出現一次或更多次的字元。例如,正則表達式 bo+. 可匹配 bob、book 和 boot。在本例中,將句點 (.) 和加號 (+) 組合成一個語法。句號 (.) 緊挨在加號 (+) 表達式之後。加號 (+) 可與出現一次或更多次的字母「o」相匹配。句點 (.) 用作每個單詞的最後一個字元的通配符。在本例中,該字元為「b」、「k」和「t」。@最小為零或更多 用於匹配在此表達式之前出現零次或更多次的某個字元,可與盡可能少的字元相匹配。正則表達式 .@ 用於匹配某個出現零次或更多次的字元。例如,正則表達式 a.@x 可匹配「abxbxb」中的「abx」和「acxcxc」中的「acx」。在本例中,將句號 (.) 和 @ 符號組合成一個語法。句點 (.) 緊挨在 @ 符號表達式之前。@ 符號可與「a」和「x」之間出現零次或更多次的任意字元相匹配。在本例中,句點 (.) 用作字元「a」和「x」之間的字元「b」和「c」的通配符。#最小為一或更多 用於匹配在此表達式之前出現一次或更多次的某個字元,可與盡可能少的字元相匹配。例如,正則表達式 si.#er 可匹配「sicker」或「silkier」。在本例中,將句號 (.) 和井號 (#) 組合成一個語法。句點 (.) 緊挨在井號 (#) 表達式之前。井號 (#) 可與「si」和「er」之間出現一次或更多次的任意字元相匹配。句點 (.) 用作單詞 sicker 中字元「c」和「k」的通配符,以及單詞 silkier 中「l」、「k」和「i」的通配符。[ ]字元集 用於匹配括弧 ([ ]) 內的任意一個字元。可以使用連字元 (-) 指定字元的范圍,例如 [a-z]。例如:正則表達式 c[aou]t 可以匹配 cat、cot 和 cut,但不能匹配 cet 或 cit。正則表達式 [0-9] 表示匹配任意一個數字。也可以指定多個字母範圍。正則表達式 [A-Za-z] 表示匹配所有大寫和小寫字母。^行首 定位於行首匹配。例如,正則表達式 ^When in 匹配以「When in」開頭且出現於行首的任意字元串,例如「When in the course of human events」或「When in town, call me」。然而,此正則表達式不匹配出現於行首的「What and when in the course of human events」。$行尾 定位於行尾匹配。例如,正則表達式 professional$ 可匹配字元串「He is a professional」,但不能匹配字元串「They are a group of professionals」。^^文件開頭 定位於文件開頭匹配。僅適用於在源代碼或文本文件中搜索文本。例如,若要匹配文件開頭的第一個 HTML 標記,請使用此正則表達式:^^$$文件末尾 定位於文件末尾匹配。僅適用於在源代碼或文本文件中搜索文本。例如,若要匹配文件末尾的最後一個 HTML 標記(標記後沒有空格),可使用此正則表達式:$$|或 表示在兩項之間進行選擇,即匹配「或」符號 (|) 前面或後面的表達式。例如,正則表達式 (him|her) 匹配下列各項:「it belongs to him」或者「it belongs to her」但不匹配行「it belongs to them」。\轉義特殊字元 用於匹配反斜線 (\) 後面的字元。這樣,就可以查找正則表達式語法中使用的字元(如左大括弧 ({) 或脫字型大小 (^))或其他一些特殊字元。例如,使用 \$ 可匹配美元符號 ($) 字元,而不是執行用於「定位於行尾」的正則表達式。同樣,使用 \. 可匹配句號 (.) 字元,而不是像句號 (.) 正則表達式一樣匹配任意一個字元。{}標記表達式 對與括弧內表達式匹配的文本加標記。可以使用 \N 在「查找」表達式中匹配出現在另一處的標記文本或者將標記文本插入「替換」表達式。例如,假設要查找連續出現兩次的單詞。若要搜索,請使用此表達式:{.#} \1假設連續出現的單詞由一個空格隔開,則需要在右大括弧 (}) 與反斜線 (\) 之間添加一個空格。在本例中,將井號 (#)、句號 (.) 和大括弧 ({}) 組合成一個語法。在此表達式中,.# 表示任何連續的字元。因為這部分表達式位於大括弧 ({}) 內,所以連續的字元將被加上標記,並被引用為 \1。此表達式將查找後跟空格以及字元與其完全相同的任意連續字元。\N第N 個標記表達式 在「查找」表達式中,\N 匹配由第 N 個標記表達式指定的文本,其中 N 是 1 到 9 的數字。在「替換」表達式中,\N 插入由第 N 個標記表達式匹配的文本,其中 N 是 1 到 9 之間的數字。\0 插入整個「查找」表達式指定的文本。例如,假設要查找連續出現兩次的單詞,並使用一個單詞替換它們。若要搜索,請使用此表達式:.#} \l假設連續出現的單詞由一個空格隔開,則需要在右大括弧 (}) 與反斜線 (\) 之間添加一個空格。在本例中,將井號 (#)、句號 (.) 和大括弧 ({}) 組合成一個語法。若要替換,請使用下列表達式:\l\1 表示在查找字元串中的第一對大括弧內找到的內容。通過在替換操作中使用 \1,實際上是將連續出現兩次的單詞替換為一個單詞。( )組表達式 標記子表達式的開始和結束。子表達式指括在 ( ) 中的正則表達式,例如表達式:(ha)+。在本例中,將加號 (+) 與括弧 ( ) 組表達式組合成一個語法。子表達式是 (ha),因為它括在括弧 ( ) 內。添加加號 (+) 後,該表達式可查找重復的字母對。加號 (+) 表示「ha」出現一次或更多次。此表達式可匹配下列各項:「haha」和「hahaha」。~x防止匹配 當x 出現在表達式中的此位置時會防止匹配。例如,正則表達式 real~(ity) 可匹配「realty」和「really」中的「real」,但不能匹配「reality」中的「real」。\n換行符 用於匹配「代碼」視圖中的新行,或「設計」視圖中的 <br>。語法(\n) 是匹配所有換行符的簡便方法。\t製表符 用於匹配單個製表符。例如,如果要查找所有位於行首的製表符,可使用此正則表達式:^\t+在本例中,將脫字型大小 (^)、加號 (+) 和製表符 (\t) 組合成一個語法。脫字型大小 (^) 位於單個製表符表達式之前,用於匹配位於行首的所有製表符。加號 (+) 表示匹配一個或多個製表符。[^]任何一個不屬於該集合的字元 用於匹配不包含在脫字型大小 (^) 之後的字元集內的任何字元。例如,若要匹配范圍之外的任何字元,可使用脫字型大小 (^) 作為左括弧後面的第一個字元。表達式 [^269A-Z] 匹配除 2、6、9 以及任何大寫字母之外的所有字元。n重復表達式 用於匹配脫字型大小 (^) 之前出現 n 次的表達式。例如,若 n 為 4,表達式 [0-9]^4 匹配任何 4 位數序列。在本例中,將字元集 ([ ]) 語法與重復 (^n) 語法組合,以展示正則表達式的更實用的方法。:a字母數字字元 用於匹配表達式 [a-zA-Z0-9]。可以使用表達式 [a-zA-Z0-9] 匹配出現一次的字母(大寫或小寫)或數字。也稱為「字母數字匹配項」。可使用簡寫表達式 :a 來代替 [a-zA-Z0-9]。:b空格 用於匹配代碼或文本中的任何空格。例如,若要匹配行首的單個空格字元,請使用此正則表達式:^:b:c字母字元 用於匹配表達式 [a-zA-Z]。使用此表達式時,可以匹配所有大寫或小寫字母。可以使用簡寫表達式 :c 來代替所有 [a-zA-Z]。:d十進制數 用於匹配表達式 [0-9]。利用此表達式可以匹配任何數字。例如,假設要在文本文件中查找美國的社會福利號。美國的社會福利號的格式為 999-99-9999。:d^3-:d^2-:d^4 或 [0-9]^3-[0-9]^2-[0-9]^4(使用 [0-9] 表示)可返回相同的結果。可使用簡寫表達式 :d 來代替所有 [0-9]。:h十六進制數 用於匹配表達式 [0-9a-fA-F]+使用此表達式可匹配由「A」和「F」之間的大寫或小寫字母和任意數字組成的十六進制數。例如,假設網站中的網頁使用了多種不同的背景色,而您要將這些網頁的顏色改為黑色(即 000000)。但是,您不知道現有顏色的十六進制值。使用此正則表達式可查找所有的現有十六進制值:\#:h可以使用 [0-9a-fA-F] 進行搜索,但在本例中,將反斜線 (\)、井號 (#) 和十六進制數字 (:h) 語法組合在一起。\# 匹配非表達式的井號 (#),而 :h 匹配任何十六進制字元序列。若要替換現有十六進制數值,可鍵入所需背景顏色的十六進制數值: 000000:i標識符 用於匹配表達式 [a-zA-Z_$][a-zA-Z0-9_$]*處理代碼時,如果需要匹配所有程序標識符,可使用簡寫表達式 :i,而無需鍵入上述冗長的表達式。:n有理數 用於匹配表達式 ([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+)|([0-9]+)如果需要匹配帶小數點的整個數值,可使用簡寫表達式 :n,而無需鍵入上述冗長的表達式。:q帶引號的字元串 用於匹配表達式 ("[~"]*")|('[~']*')如果需要匹配加引號的所有引號,可使用簡寫表達式 :q,而無需鍵入上述冗長的表達式。:w字母字元串 用於匹配表達式 [a-zA-Z]+此語法是一種可匹配一個或多個大寫或小寫字母字元的簡便方法。:z整數 用於匹配表達式 [0-9]+此語法是一種可匹配任何整數的簡便方法。
❻ 如何在sql server中使用正則表達式
大致步驟是:
1.下載他提供的那個壓縮包,裡面有源代碼和安裝腳本
2.將DLL復制到SQL
Server規定的目錄
3.運行INSTALL.sql這個腳本
大致使用的效果如下
SELECT
master.dbo.fn_pcre_match('[email protected]','^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$')
這句腳本的意思是,根據後面的正則表達式(一個email的規則)匹配前面的字元串.
如果返回1的話,表示匹配到了,否則返回0.
❼ 怎麼用正則表達式解析sql語句
先看要解析的樣例SQL語句:
select * from al
SELECT * frOm al
Select C1,c2 From tb
select c1,c2 from tb
select count(*) from t1
select c1,c2,c3 from t1 where condi1=1
Select c1,c2,c3 From t1 Where condi1=1
select c1,c2,c3 from t1,t2 where condi3=3 or condi4=5 order by o1,o2
Select c1,c2,c3 from t1,t2 Where condi3=3 or condi4=5 Order by o1,o2
select c1,c2,c3 from t1,t2,t3 where condi1=5 and condi6=6 or condi7=7 group by g1,g2
Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group by g1,g2
Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group by g1,g2,g3 order by g2,g3
解析效果之一(isSingleLine=false):
原SQL為select * from al
解析後的SQL為
select
*
from
al
原SQL為SELECT * frOm al
解析後的SQL為
select
*
from
al
原SQL為Select C1,c2 From tb
解析後的SQL為
select
C1,c2
from
tb
原SQL為select c1,c2 from tb
解析後的SQL為
select
c1,c2
from
tb
原SQL為select count(*) from t1
解析後的SQL為
select
count(*)
from
t1
原SQL為select c1,c2,c3 from t1 where condi1=1
解析後的SQL為
select
c1,c2,c3
from
t1
where
condi1=1
原SQL為Select c1,c2,c3 From t1 Where condi1=1
解析後的SQL為
select
c1,c2,c3
from
t1
where
condi1=1
原SQL為select c1,c2,c3 from t1,t2 where condi3=3 or condi4=5 order by o1,o2
解析後的SQL為
select
c1,c2,c3
from
t1,t2
where
condi3=3 or condi4=5
order by
o1,o2
原SQL為Select c1,c2,c3 from t1,t2 Where condi3=3 or condi4=5 Order by o1,o2
解析後的SQL為
select
c1,c2,c3
from
t1,t2
where
condi3=3 or condi4=5
order by
o1,o2
原SQL為select c1,c2,c3 from t1,t2,t3 where condi1=5 and condi6=6 or condi7=7 group by g1,g2
解析後的SQL為
select
c1,c2,c3
from
t1,t2,t3
where
condi1=5 and condi6=6 or condi7=7
group by
g1,g2
原SQL為Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group by g1,g2
解析後的SQL為
select
c1,c2,c3
from
t1,t2,t3
where
condi1=5 and condi6=6 or condi7=7
group by
g1,g2
原SQL為Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group by g1,g2,g3 order by g2,g3
解析後的SQL為
select
c1,c2,c3
from
t1,t2,t3
where
condi1=5 and condi6=6 or condi7=7
group by
g1,g2,g3
order by
g2,g3
解析效果之二(isSingleLine=true):
原SQL為select * from al
解析後的SQL為
select
*
from
al
原SQL為SELECT * frOm al
解析後的SQL為
select
*
from
al
原SQL為Select C1,c2 From tb
解析後的SQL為
select
C1,
c2
from
tb
原SQL為select c1,c2 from tb
解析後的SQL為
select
c1,
c2
from
tb
原SQL為select count(*) from t1
解析後的SQL為
select
count(*)
from
t1
原SQL為select c1,c2,c3 from t1 where condi1=1
解析後的SQL為
select
c1,
c2,
c3
from
t1
where
condi1=1
原SQL為Select c1,c2,c3 From t1 Where condi1=1
解析後的SQL為
select
c1,
c2,
c3
from
t1
where
condi1=1
原SQL為select c1,c2,c3 from t1,t2 where condi3=3 or condi4=5 order by o1,o2
解析後的SQL為
select
c1,
c2,
c3
from
t1,
t2
where
condi3=3 or
condi4=5
order by
o1,
o2
原SQL為Select c1,c2,c3 from t1,t2 Where condi3=3 or condi4=5 Order by o1,o2
解析後的SQL為
select
c1,
c2,
c3
from
t1,
t2
where
condi3=3 or
condi4=5
order by
o1,
o2
原SQL為select c1,c2,c3 from t1,t2,t3 wher www.hnne.com e condi1=5 and condi6=6 or condi7=7 group by g1,g2
解析後的SQL為
select
c1,
c2,
c3
from
t1,
t2,
t3
where
condi1=5 and
condi6=6 or
condi7=7
group by
g1,
g2
原SQL為Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group by g1,g2
解析後的SQL為
select
c1,
c2,
c3
from
t1,
t2,
t3
where
condi1=5 and
condi6=6 or
condi7=7
group by
g1,
g2
原SQL為Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group by g1,g2,g3 order by g2,g3
解析後的SQL為
select
c1,
c2,
c3
from
t1,
t2,
t3
where
condi1=5 and
condi6=6 or
condi7=7
group by
g1,
g2,
g3
order by
g2,
g3
使用的類SqlParser,你可以拷貝下來使用之:
package com.sitinspring.common.sqlFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* SQL語句解析器類
* @author: sitinspring([email protected])
* @date: 2008-3-12
*/
public class SqlParser{
/**
* 逗號
*/
private static final String Comma = ",";
/**
* 四個空格
*/
private static final String FourSpace = " ";
/**
* 是否單行顯示欄位,表,條件的標識量
*/
private static boolean isSingleLine=true;
/**
* 待解析的SQL語句
*/
private String sql;
/**
* SQL中選擇的列
*/
private String cols;
/**
* SQL中查找的表
*/
private String tables;
/**
* 查找條件
*/
private String conditions;
/**
* Group By的欄位
*/
private String groupCols;
/**
* Order by的欄位
*/
private String orderCols;
/**
* 構造函數
* 功能:傳入構造函數,解析成欄位,表,條件等
* @param sql:傳入的SQL語句
*/
public SqlParser(String sql){
this.sql=sql.trim();
❽ 如何在sql語句中使用正則表達式
sqlserver中,主要有regexp_like,regexp_replace,regexp_substr,regexp_instr四個正則表達式函數。
1、regexp_like:
regexp_like(x,pattern[,match_option]),查看x是否與pattern相匹配,該函數還可以提供一個可選的參數match_option字元串說明默認的匹配選項。match_option的取值如下:
'c' 說明在進行匹配時區分大小寫(預設值);
'i' 說明在進行匹配時不區分大小寫;
'n' (.)點號能表示所有單個字元,包括換行(俺還不知道什麼地方有用到換行.只知道sql裡面可以用chr(10)表示換行、
'm' 字元串存在換行的時候當作多行處理.這樣$就可匹配每行的結尾.不然的話$只匹配字元串最後的位置、
示例:
select * from emp where regexp_like(ename,'^a[a-z]*n$');
可以查找ename中以a開頭以n結尾的行.例如ename為arwen或arwin或anden.但Arwen不能被匹配.因為默認是區分大小寫.如果是
select * from emp where regexp_like(ename,'^a[a-z]*n$','i')
則可以查找ename為Arwen的行記錄。
2、regexp_instr:
REGEXP_INSTR(x,pattern[,start[,occurrence[,return_option[, match_option]]]])用於在x中查找pattern。返回pattern在x中出現的位置。匹配位置從1開始。可以參考字元串函數 INSTR(),參數相關:
'start' 開始查找的位置;
'occurrence' 說明應該返回第幾次出現pattern的位置;
'return_option' 說明應該返回什麼整數。若該參數為0,則說明要返回的整數是x中的一個字元的位置;若該參數為非0的整數,則說明要返回的整數為x中出現在pattern之後 的字元的位置;
'match_option' 修改默認的匹配設置.與regexp_like裡面的相同.
示例:
DECLARE
V_RESULT INTEGER ;
BEGIN
SELECT REGEXP_INSTR('hello world','o',1,1,0) INTO V_RESULT
FROM DUAL;
DBMS_OUTPUT.PUT_LINE(V_RESULT);
END;
結果為5,即字母o第一個次出現的位置。
如果regexp_instr('hello world','o',1,1,n)其中n為除0之外的整數。比如1,3。則結果為6.表示第一次出現字母o的後面一個字元的位置。
如果regexp_instr('hello world','o',1,2,0)則結果為9.表示第二次出現字母o的位置.
3、regexp_replace:
REGEXP_REPLACE(x,pattern[,replace_string[,start[,occurrence[, match_option]]]])用於在x中查找pattern,並將其替換為replae_string。可以參考字元串函數 REPLACE(),參數同REGEXP_INSTR函數
示例:
DECLARE
V_RESULT varchar2(90);
BEGIN
SELECT REGEXP_REPLACE('hello world','o','x',1,1) INTO V_RESULT
FROM DUAL;
DBMS_OUTPUT.PUT_LINE(V_RESULT);
END;
結果為hellx world.
如果REGEXP_REPLACE('hello world','o','x'),則結果為hellx wxrld.
如果 REGEXP_REPLACE('hello world','o','x',1,2)則結果為hello wxrld.
4、regexp_substr:
REGEXP_SUBSTR(x,pattern[,start[,occurrence[, match_option]]])用於在x中查找pattern並返回。可以參考字元串函數 SUBSTR(),參數同REGEXP_INSTR函數.
例如:
DECLARE
V_RESULT VARCHAR2(255);
BEGIN
SELECT REGEXP_SUBSTR('hello world','l{2}') INTO V_RESULT
FROM DUAL;
DBMS_OUTPUT.PUT_LINE(V_RESULT);
END ;
結果為ll
查詢到匹配的字元串才返回匹配的字元.沒查到就返回空。
❾ java程序中Sql語句中用正則表達式的使用
標准SQL不支持正則表達式查詢吧。
你這種情況,只能是:
select * from {table} where name like 'ZHANG%' OR 'zhang%' 來搜
放入另一個表的話
insert into target_table_name
select select * from src_table_name where name like 'ZHANG%' OR 'zhang%'
目前:Oracle10g支持了正則表達式,用法:
SELECT * FROM table_name WHERE REGEXP_LIKE(TO_CHAR(start_date, 'YYYY'), '^199[5-8]$');
regexp_like函數的基本構成是:
regexp_like(x,pattern[,match_option])
其基本功能是在x中查找pattern,如果能找到返回true否則返回false,這里的可選參數match_option可以有如下幾種形式:
『c』 表明進行匹配時區分大小寫(這也是默認選項)。
『i』 表明在匹配時不區分大小寫。
『n』 表明允許使用匹配任何字元串的元數據,即』.'。
『m』將x作為一個包含多行的字元串。
以下是兩個關於regexp_like的例子:
這個例子是尋找員工中的80後的員工。
select * from emp where regexp_like(to_char(birthdate,』yyyy』),』^198[0-9]$』);
這個例子是尋找名字是以』M'或者』m'打頭的那些員工的名字
select * from emp where regexp_like(ename,』^j』,'i』)
❿ Db2 中的sql 怎樣實現正則表達式的功能
盡管上面的函數按照預期的方式工作,但還可以改進它以獲得更佳的性能。註:函數內部的執行完成得越快,DB2 處理整個 SQL 語句的速度也就越快。
SQL 旨在處理多組行,這意味著通常會針對一個模式匹配多個行。在大多數情況下,模式本身對於整個 SQL 語句都是不變的;即,它不會隨行的更改而更改。 清單 5 中的 C 代碼展示了對每一行都調用函數 pcre_compile() ,該函數將給定模式轉換成內部表示法。
DB2 通過使用所謂的「高速暫存(scratchpad)」提供了在 UDF 調用之間傳遞信息的機制。此外,您可以標識特定調用「類型」;即它是對該 UDF 的第一次調用、普通調用還是最後一次(最終)調用。使用高速暫存和調用類型,有可能只對模式編譯一次,然後將該已編譯模式的內部表示法重用於對該 UDF 的所有後續調用。在最後一次調用時,釋放在處理期間分配的資源。
如 清單 6所示,對 CREATE FUNCTION 語句進行修改,告訴 DB2 向外部 C 代碼提供高速暫存和調用類型:
清單 6. 將高速暫存和調用類型添加到 CREATE FUNCTION 語句
CREATE FUNCTION regex2(pattern VARCHAR(2048), string CLOB(10M))
RETURNS INTEGER
SPECIFIC regexPerf
EXTERNAL NAME 'regexUdf!regexpPerf'
LANGUAGE C
PARAMETER STYLE DB2SQL
DETERMINISTIC
NOT FENCED
RETURNS NULL ON NULL INPUT
NO SQL
NO EXTERNAL ACTION
SCRATCHPAD 50
FINAL CALL
ALLOW PARALLEL;
UDF 入口點看起來很不一樣,因為必須改寫函數內部的邏輯。參數方面唯一的更改是使用 SQLUDF_TRAIL_ARGS_ALL 代替了 SQLUDF_TRAIL_ARGS ,如 清單 7所示。
清單 7. regex2 的 C UDF 入口點
#include <pcre.h>
#include <sqludf.h>
// data structure mapped on the scratchpad for easier use and access
// to the objects
// the size of the scratchpad defined in the CREATE FUNCTION statement
// must be at least as large as sizeof(scratchPadMapping)
struct scratchPadMapping {
pcre *re;
pcre_extra *extra;
const char *error;
int errOffset;
};
void regexpPerf(
// input parameters
SQLUDF_VARCHAR *pattern, SQLUDF_CLOB *str,
// output
SQLUDF_INTEGER *match,
// null indicators
SQLUDF_NULLIND *pattern_ind, SQLUDF_NULLIND *str_ind,
SQLUDF_NULLIND *match_ind,
SQLUDF_TRAIL_ARGS_ALL) // SQLUDF_SCRAT & SQLUDF_CALLT
{
int rc = 0;
struct scratchPadMapping *scratch = NULL;
// map the buffer of the scratchpad and assume successful return
scratch = (struct scratchPadMapping *)SQLUDF_SCRAT->data;
*match_ind = 0;
switch (SQLUDF_CALLT) {
case SQLUDF_FIRST_CALL:
// initialize data on the scratchpad
scratch->re = NULL;
scratch->extra = NULL;
scratch->error = NULL;
scratch->errOffset = 0;
// compile the pattern (only in the FIRST call
scratch->re = pcre_compile(pattern, 0 /* default options */,
&scratch->error, &scratch->errOffset, NULL);
if (scratch->re == NULL) {
snprintf(SQLUDF_MSGTX, 70, "Regexp compilation failed at "
"offset %d: %s\\n", scratch->errOffset, scratch->error);
strcpy(SQLUDF_STATE, "38900");
rc = -1;
break;
}
// further analyze the pattern (might return NULL)
scratch->extra = pcre_study(scratch->re,
0 /* default options */, &scratch->error);
/* fall through to NORMAL call because DB2 expects a result
already in the FIRST call */
case SQLUDF_NORMAL_CALL:
// match the current string
rc = pcre_exec(scratch->re, scratch->extra, str->data,
str->length, 0, 0 /* default options */, NULL, 0);
switch (rc) {
case PCRE_ERROR_NOMATCH:
*match = 0;
rc = 0;
break;
case PCRE_ERROR_BADOPTION:
snprintf(SQLUDF_MSGTX, 70, "An unrecognized bit was set "
"in the options argument");
strcpy(SQLUDF_STATE, "38901");
rc = -1;
break;
case PCRE_ERROR_NOMEMORY:
snprintf(SQLUDF_MSGTX, 70, "Not enough memory available.");
strcpy(SQLUDF_STATE, "38902");
rc = -1;
break;
default:
if (rc < 0) {
snprintf(SQLUDF_MSGTX, 70, "A regexp match error "
"occured: %d", rc);
strcpy(SQLUDF_STATE, "38903");
rc = -1;
}
else {
*match = 1;
rc = 0;
}
break;
}
break;
}
// cleanup in FINAL call, or if we encountered an error in
// the FIRST call (DB2 will make a FINAL call if we encounter
// an error in any NORMAL call)
if (SQLUDF_CALLT == SQLUDF_FINAL_CALL ||
(SQLUDF_CALLT == SQLUDF_FIRST_CALL && rc < 0)) {
(*pcre_free)(scratch->re);
(*pcre_free)(scratch->extra);
}
return;
}
為了進一步改進該函數的性能,我添加了對函數 pcre_study() 的調用,該函數是由模式匹配引擎提供的。該函數進一步分析了該模式,並將額外的信息存儲在獨立的結構中。然後,在實際的匹配期間使用這些額外的信息來加快處理速度。通過使用一個非常簡單的模式和大約 4000 行的表,我獲得了 5% 的執行時間的改善。當然,模式越復雜,差異將越顯著。
我先前提到該實現假定模式在處理期間不會隨行的不同而更改。當然,如果模式確實更改了,您可以進行少量的改寫以再次編譯一個模式。要這樣做,有必要跟蹤當前(已編譯的)模式並在每次調用中將它與所提供的模式進行比較。也可以在高速暫存中維護當前模式。但必須將它復制到獨立的緩沖區,並且不能通過指針模式直接引用它,因為這個指針或它所引用的數據可能會更改或變為無效。至於相應的代碼更改,就當作練習留給讀者了。
返回匹配子串
大多數模式匹配引擎提供了一種方法,返回與指定模式或其一部分相匹配的子串。如果想在 SQL 中使用這種能力,則必須使用不同的方法來實現匹配函數。給定的字元串可能包含不止一個匹配的子串。例如,當解析類似「abc = 123;」或「def = 'some text';」這樣的字元串時,用戶可能會希望檢索由等號分隔的兩個子串。您可以使用模式「\\w+\\s*=\\s*(\\d+|'[\\w\\s] *');」來表示適用於該字元串的語法規則。Perl 兼容的正則表達式允許您捕獲等號兩邊的子串。最後,必須將要捕獲的子串用括弧括起來。我已經用該方式編寫了第二個子串,但第一個子串不是這樣編寫的。用於該用途的最終模式是這樣的:
(\\w+)\\s*=\\s*(\\d+|'[\\w\\s]*');
當把這個模式應用於字元串「abc= 123;」或「def = 'some text';」時,「abc」或「def」分別與「(\\w+)」匹配,空格和等號是通過「\\s*=\\s*」查找的,並用另外的「(\\d+|'[\ \w\\s*]')」涵蓋了餘下的子串。在「(\\d+|'[\\w\\s*]')」中,第一個選項與任何至少由一個數字「\\d+」組成的數匹配,而第二個選項解析任何由字母和空格組成的由單引號括起的字元串「'[\\w\\s]*'」。
在 DB2 中做到這一點的需求可以描述成:為一次 UDF 調用返回多個結果。換句話說,就是返回針對模式進行匹配的單個字元串的多個子串。DB2 的表函數是完成這一任務的完美工具。
實現表 UDF
和以前一樣,必須在資料庫中創建該函數。 清單 8中的下列語句正是用於這一任務的:
清單 8. 注冊名為 regex3 的表 UDF
CREATE FUNCTION regex3(pattern VARCHAR(2048), string CLOB(10M))
RETURNS TABLE ( position INTEGER, substring VARCHAR(2048) )
SPECIFIC regexSubstr
EXTERNAL NAME 'regexUdf!regexpSubstr'
LANGUAGE C
PARAMETER STYLE DB2SQL
DETERMINISTIC
NOT FENCED
RETURNS NULL ON NULL INPUT
NO SQL
NO EXTERNAL ACTION
SCRATCHPAD 50
NO FINAL CALL
DISALLOW PARALLEL;
實現該函數的實際邏輯的 C 代碼與 清單 7中的代碼非常相似,但根據表函數所必須滿足的特殊需求對它進行了改編,如 清單 9所示
你還是看一下這個網站
http://news.weixiuwang.com/server/2006-6/2006E6Y2;1057E89818855_1.htm