當前位置:首頁 » 編程語言 » 正則表達式匹配sql

正則表達式匹配sql

發布時間: 2024-06-18 01:21:06

資料庫筆記-sql過濾(LIKE&正則表達式)

查詢語句:

結果:

查詢語句:

結果:

查詢語句:

結果:

查詢語句:

正則表達式 [32]1,[32]定義一組字元,它的意思是匹配 3 或匹配 2,也就是「31」或者 「21」都算是匹配的。

結果:

查詢語句:

結果:

如果要匹配特殊字元的,需要加上前導「」,「-」表示查找「-」,「.」表示查找「.」
這種就是 「轉義(escaping)」 ,在正則表達式里,本身有意義的字元,比如「.」是匹配任意字元的意思。那如果要匹配它,需要轉義。
注意:在 MySQL 里,是比其他的正則表達式多一個「」的,就是「」。

趣味提問:

如何匹配「」?
答案:「\」

\([0-9] sticks?\) 匹配的是(NUM stick)或者(NUM sticks)。s後的 ? 使得s可選。

重復元字元

* 是 0 個或多個匹配
? 是 1 個或多個匹配
{n} 是指定n個匹配
{n,} 是 不少於 n 個匹配
{n,m} 是 指定匹配的范圍,m不超過 255

查詢語句:

^值的是字元串的開始,$是字元串的結尾。

這就是 REGEXP 與 LIKE 類似,但是它獨特的好處:可以通過「定位符」只匹配「子字元串」。

結果:

⑵ 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

⑶ 在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語句

publicstaticRegexrxColumns=newRegex(@"A(withs+(?:(?!as).)+s+as)?s*SELECTs+((?:((?>((?<depth>)|)(?<-depth>)|.?)*(?(depth)(?!)))|.)*?)(?<!,s+)FROM",RegexOptions.IgnoreCase|RegexOptions.Multiline|RegexOptions.Singleline|RegexOptions.Compiled);

⑸ SQL Server 2008 R2如何使用正則表達式搜索

正則表達式是簡明而靈活的表示法,用於查找和替換各種模式的文本。在 SQL Server Management Studio 的「查找和替換」對話框中的「查找內容」欄位中,可以使用一組特定的正則表達式。

使用正則表達式進行查找
1、若要在「快速查找」、「在文件中查找」、「快速替換」或 「在文件中替換」 操作過程中,在「查找內容」欄位啟用正則表達式,請在「查找選項」下選中「使用」,再選擇「正則表達式」。
2、「查找內容」欄位旁邊的「引用列表」三角形按鈕將變為可用狀態。單擊此按鈕可顯示一組最常用的正則表達式。如果選擇了表達式生成器中的某個項,則可將該項插入「查找內容」字元串。

注意:

「查找內容」字元串中使用的正則表達式與 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:\e Unicode U+001B。

響鈴: \g Unicode U+0007。

Backspace: \h Unicode 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
匹配象形字元,如漢字和日文漢字。

⑹ 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前面必須是個加括弧的子表達式.

  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

  1. 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

查詢到匹配的字元串才返回匹配的字元.沒查到就返回空.

熱點內容
戲曲的腳本 發布:2024-06-26 22:16:29 瀏覽:20
郵件伺服器ip查詢 發布:2024-06-26 22:16:22 瀏覽:399
帶計算器的文件夾 發布:2024-06-26 22:06:39 瀏覽:802
博易大師指標源碼 發布:2024-06-26 21:37:57 瀏覽:540
phantomjspython爬蟲 發布:2024-06-26 21:37:49 瀏覽:560
畫出編譯的工作過程圖 發布:2024-06-26 21:27:29 瀏覽:963
雲伺服器ip有重復可能嗎 發布:2024-06-26 21:21:25 瀏覽:266
java面試題2018及答案 發布:2024-06-26 21:12:57 瀏覽:762
編譯的全部過程及階段 發布:2024-06-26 21:04:30 瀏覽:742
腳本工作專業 發布:2024-06-26 20:42:51 瀏覽:261