1. 程式人生 > 程式設計 >SQL Anywhere正則表示式語法與示例

SQL Anywhere正則表示式語法與示例

正則表示式語法

通過 SIMILAR TO 和 REGEXP 搜尋條件以及 REGEXP_SUBSTR 函式支援正則表示式。對於 SIMILAR TO,正則表示式語法符合 ANSI/ISO SQL 標準。對於 REGEXP 和 REGEXP_SUBSTR,正則表示式的語法和支援符合 Perl 5。

REGEXP 和 SIMILAR TO 使用正則表示式是與字串 相匹配,而 REGEXP_SUBSTR 使用正則表示式則是與子串 相匹配。要實現 REGEXP 和 SIMILAR TO 的子串匹配行為,可在要嘗試匹配的模式的任何一側指定萬用字元。例如,REGEXP '.*car.*' 會與 car、carwash 和 vicar 匹配。或者,可重寫查詢以使用 REGEXP_SUBSTR 函式。請參見REGEXP_SUBSTR 函式 [String]。

通過 SIMILAR TO 匹配的正則表示式不區分大小寫,也不區分重音。REGEXP 和 REGEXP_SUBSTR 不受資料庫區分重音和大小寫的影響。請參見LIKE、REGEXP 和 SIMILAR TO:字元比較上的差異。

正則表示式:元字元

元字元是在正則表示式中具有特殊含義的符號或字元。

元字元的處理視以下情況而異:

  • 正則表示式是與 SIMILAR TO 或 REGEXP 搜尋條件一起使用,還是與 REGEXP_SUBSTR 函式一起使用

  • 元字元是否在正則表示式的字元類的內部

在繼續之前,應瞭解字元類的定義。字元類是一組括在方括號內的字元,將根據這組字元對字串中的字元進行匹配。例如,在 SIMILAR TO 'ab[1-9]' 語法中,[1-9] 就是一個字元類,它與 1 到 9 範圍中(包括 1 和 9)的某一數字匹配。正則表示式中元字元的處理方式各不相同,這取決於元字元是否被放在字元類的內部。具體來說,當元字元放在字元類的內部時,多數元字元作為常規字元來處理。

對於 SIMILAR TO(僅限於 SIMILAR TO),元字元 *、?、+、_、|、(、)、{ 必須在字元類內進行轉義。

要在字元類中包括減號 (-)、脫字元 (^) 或直角方括號 (]) 字元,必須將字元轉義。

下面給出了所支援的正則表示式元字元的列表。當 SIMILAR TO、REGEXP 和 REGEXP_SUBSTR 使用元字元時,幾乎所有元字元的處理方式都相同:

字元 其它資訊
[] 左右方括號用於指定字元類。字元類是進行匹配時所要依據的一組字元。

除連字元 (-) 和脫字元 (^) 外,在字元類中指定的元字元和量詞(如 * 和 {m},分別為元字元和量詞)沒有特殊意義,可當作實際字元進行運算。

SQL Anywhere 還支援子字元類,例如 POSIX 字元類。請參見正則表示式:特殊子字元類。

* 星號可用於與字元匹配 0 次或多次。例如,REGEXP '.*abc' 匹配的字串以 abc 結尾並以任何字首開頭。因此,aabc、xyzabc 和 abc 匹配,但 bc 和 abcc 則不匹配。
? 問號可用於與字元匹配 0 次或 1 次。例如,'colou?r' 匹配 color 和 colour。
+ 加號可用於與字元匹配 1 次或多次。例如,'bre+' 匹配 bre 和 bree,但不匹配 br。
- 可以在字元類中使用一個連字元來表示一個範圍。例如,REGEXP '[a-e]' 匹配 a、b、c、d 和 e。

有關 REGEXP 和 SIMILAR TO 如何對範圍求值的詳細資訊,請參見LIKE、REGEXP 和 SIMILAR TO:字元比較上的差異。

% 百分號可與 SIMILAR TO 配合使用來匹配任意數目的字元。

不將百分號視為 REGEXP 和 REGEXP_SUBSTR 所使用的元字元。當指定時,它匹配百分號 (%)。

_(下劃線字元) 可將下劃線與 SIMILAR TO 配合使用來匹配單個字元。

不將下劃線視為 REGEXP 和 REGEXP_SUBSTR 所使用的元字元。當指定時,它匹配下劃線 (_)。

| 管道符號用於指定匹配字串時要使用的替代模式。在由豎線分隔的一行模式中,豎線被解釋為 OR,匹配過程從最左側的模式開始,在找到第一個匹配項時停止。因此,您應按優先順序的降序順序列出模式。您可以指定任意數量的替代模式。
() 當左括號和右括號用於正則表示式的各個組合部分時,它們為元字元。例如,(ab)* 匹配零個或多個 ab 的重複項。與使用數學表示式一樣,您使用組合來控制正則表示式各部分的計算順序。
{} 當左大括號和右大括號用於指定量詞時,它們為元字元。量詞指定一個模式要構成某個匹配所必須重複的次數。例如:

  • {m} 匹配某個字元正好 m 次。例如,'519-[0-9]{3}-[0-9]{4}' 匹配 519 地區號中的一個電話號碼(假定資料按語法中定義的方式進行格式設定)。

  • {m,} 匹配某個字元至少 m 次。例如,'[0-9]{5,}' 匹配任何含有五個或更多數字的字串。

  • {m,n} 匹配某個字元至少 m 次,但不超過 n 次。例如,SIMILAR TO '_{5,10}' 匹配任何含有 5 到 10(含 5 和 10)個字元的字串。

\ 反斜線被用作元字元的轉義字元。它也可被用於轉義非元字元。
^ 對於 REGEXP 和 REGEXP_SUBSTR,當脫字元在字元類的外部時,脫字元匹配字串的開頭字元。例如,'^[hc]at' 匹配 hat 和 cat,但只在字串的開頭。

當用在字元類內部時,以下行為適用:

  • REGEXP 和 REGEXP_SUBSTR 當脫字元為字元類中的第一個字元時,它與字符集中字元以外的任何字元匹配。例如,REGEXP '[^abc]' 匹配 a、b 或 c 以外的任何字元。

    如果脫字元不是方括號內的第一個字元,那麼它匹配脫字元。例如,REGEXP_SUBSTR '[a-e^c]' 匹配 a、b、c、d、e 和 ^。

  • SIMILAR TO 對於 SIMILAR TO,脫字元被視作減號運算子。例如,SIMILAR TO '[a-e^c]' 匹配 a、b、d 和 e。

$ 當與 REGEXP 和 REGEXP_SUBSTR 一起使用時,匹配字串的結尾字元。例如,SIMILAR TO 'cat$' 匹配 cat,但不匹配 catfish。

當與 SIMILAR TO 一起使用時,它匹配問號。

. 當與 REGEXP 和 REGEXP_SUBSTR 一起使用時,匹配任何單個字元。例如,REGEXP 'a.cd' 匹配以 a 開頭並以 cd 結尾的含有四個字元的任何字串。

當與 SIMILAR TO 一起使用時,它匹配句點 (.)。

: 在字符集中使用冒號來指定子字元類。例如,'[[:alnum:]]'

正則表示式:特殊子字元類

子字元類是嵌入到較大字元類中的特殊字元類。除了自定義字元類(在其中定義要匹配的字符集,例如,[abxq4] 將匹配字符集限制為 a、b、x、q 和 4)以外,SQL Anywhere 還支援子字元類,例如,大部分 POSIX 字元類。例如,[[:alpha:]] 表示所有大寫和小寫字母的集合。

REGEXP 搜尋條件和 REGEXP_SUBSTR 函式支援下表中的所有語法約定,但 SIMILAR TO 搜尋表示式不支援。SIMILAR TO 支援的約定在 SIMILAR TO 列中有一個 Y。

在 REGEXP 中,當使用 REGEXP_SUBSTR 函式時,可以使用脫字元對子字元類取非。例如,[[:^alpha:]] 匹配除字母字元以外的所有字元的集合。

子字元類 其它資訊 SIMILAR TO
[:alpha:] 匹配當前歸類中的大寫和小寫字母字元。例如,'[0-9]{3}[[:alpha:]]{2}' 匹配三個數字,後跟兩個字母。 Y
[:alnum:] 匹配當前歸類中的數字、大寫和小寫字母字元。例如,'[[:alnum:]]+' 匹配含有一個或多個字母和數字的字串。 Y
[:digit:] 匹配當前歸類中的數字。例如,'[[:digit:]-]+' 匹配含有一個或多個數字或橫線的字串。同樣,'[^[:digit:]-]+' 匹配含有一個或多個不是數字或橫線的字元的字串。 Y
[:lower:] 匹配當前歸類中的小寫字母字元。例如,'[[:lower:]]' 不匹配 A,因為 A 為大寫。 Y
[:space:] 匹配單個空格 (' ')。例如,以下語句搜尋 Contacts.City 以查詢任何名稱為兩個詞的城市:

SELECT City 
FROM Contacts
WHERE City REGEXP '.*[[:space:]].*';
Y
[:upper:] 匹配當前歸類中的大寫字母字元。例如,'[[:upper:]ab]' 與以下其中一項匹配:任何大寫字母、a 或 b。 Y
[:whitespace:] 匹配一個空白字元,例如,空格、製表符、換頁符和回車符。 Y
[:ascii:] 匹配任何七位的 ASCII 字元(0 到 127 之間的順序值)。
[:blank:] 匹配一個空白區或水平製表符。

[[:blank:]] 等效於 [ \t]

[:cntrl:] 匹配順序值小於 32 或字元值為 127 的 ASCII 字元(控制字元)。控制字元包括換行符、換頁符、退格符,等等。
[:graph:] 匹配列印字元。

[[:graph:]] 等效於 [[:alnum:][:punct:]]

[:print:] 匹配列印字元和空格。

[[:print:]] 等效於 [[:graph:][:whitespace:]]

[:punct:] 匹配其中一個字元: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~.

[:punct:] 子字元類不能包括當前歸類中可用的非 ASCII 標點字元。

[:word:] 匹配當前歸類中的字母、數字或下劃線字元。

[[:word:]] 等效於 [[:alnum:]_]

[:xdigit:] 匹配字元類 [0-9A-Fa-f] 中的字元。

正則表示式:所支援的其它語法約定

REGEXP 搜尋條件和 REGEXP_SUBSTR 函式支援以下語法約定,同時它們假定反斜線為轉義字元。而 SIMILAR TO 搜尋表示式不支援這些約定。

正則表示式語法 名稱和含義
\0xxx 匹配值為 \0xxx 的字元,其中 xxx 是任何八進位制數字序列,0 是零。例如,\0134 匹配反斜線。
\a 匹配報警字元。
\A 用在字符集外部以便匹配字串的開頭。

等效於在字符集外部使用的 ^

\b 匹配退格字元。
\B 匹配反斜線字元 (\)。
\cX 匹配已命名的控制字元。例如,\cZ 代表 ctrl-Z。
\d 匹配當前歸類中的一個數字。例如,以下語句搜尋 Contacts.Phone 以查詢以 00 結尾的所有電話號碼:

SELECT Surname,Surname,City,Phone
 FROM Contacts
 WHERE Phone REGEXP '\\d{8}00';

\d 既可用在字元類的內部也可用在字元類的外部,等效於 [[:digit:]]

\D 匹配數字以外的任何字元。它的作用與 \d 正好相反。

\D 既可用在字元類的內部也可用在字元類的外部,等效於 [^[:digit:]]

在方括號內使用取非速記時請務必謹慎。[\D\S][^\d\s] 並不相同。後者匹配數字或空格以外的任何字元。所以它匹配 x,但不匹配 8。而前者匹配不是數字或不是空格(滿足兩個條件之一)的任何字元。因為數字不是空格,空格也不是數字,所以 [\D\S] 可以匹配任何字元、數字、空格或其它字元。

\e 匹配轉義字元。
\E 將由 \Q 啟動的將元字元視為非元字元這一功能停止。

有關正則表示式元字元的列表,請參見正則表示式:元字元。

\f 匹配換頁符。
\n 匹配換行符。
\Q 將所有元字元視為非元字元,直到遇到 \E。例如,\Q[$\E 等效於 \[\$

有關正則表示式元字元的列表,請參見正則表示式:元字元。

\r 匹配回車符。
\s 匹配一個被視為白空格的空格或字元。例如,以下語句從 Products.ProductName 中返回名稱中至少有一個空格的所有產品名:

SELECT Name 
FROM Products
WHERE Name REGEXP '.*\\s.*'

\s 既可用在字元類的內部也可用在字元類的外部,等效於 [[:whitespace:]]。請參見正則表示式:特殊子字元類。

\S 匹配非白空格字元。它的作用與 \d 正好相反,而等效於 [^[:whitespace:]]

\S 既可用在字元類的內部也可用在字元類的外部。請參見正則表示式:特殊子字元類。

在方括號內使用取非速記時請務必謹慎。[\D\S][^\d\s] 並不相同。後者匹配數字或空格以外的任何字元。所以它匹配 x,但不匹配 8。而前者匹配不是數字或不是空格(滿足兩個條件之一)的任何字元。因為數字不是空格,空格也不是數字,所以 [\D\S] 可以匹配任何字元、數字、空格或其它字元。

\t 匹配水平製表符。
\v 匹配垂直製表符。
\w 匹配當前歸類中的字母字元、數字或下劃線。例如,以下語句從 Contacts.Surname 返回長度正好為七個字母數字字元的所有姓:

SELECT Surname 
FROM Contacts 
WHERE Surname REGEXP '\\w{7}';

\w 既可用在字元類的內部也可用在字元類的外部。請參見正則表示式:特殊子字元類。

等效於 [[:alnum:]_].

\W 匹配當前歸類中字母字元、數字或下劃線以外的任何字元。它的作用與 \w 正好相反,而等效於 [^[:alnum:]_]

在字元類的內部和外部都可使用此正則表示式。請參見正則表示式:特殊子字元類。

\xhh 匹配值為 0xhh 的字元,其中 hh 最多為兩個十六進位制數字。例如,\x2D 等效於一個連字元。

等效於 \x{hh}。

\x{hhh} 匹配值為 0xhhh 的字元,其中 hhh 最多為三個十六進位制數字。
\z\Z 匹配字串結尾處的位置(而非字元)。

等效於 $

正則表示式:斷言

斷言測試條件是否為真,並影響字串中開始匹配的位置。斷言不返回字元;最終匹配中不包括斷言模式。REGEXP 搜尋條件和 REGEXP_SUBSTR 函式支援這些斷言模式。而 SIMILAR TO 搜尋表示式不支援這些約定。

在嘗試拆分字串時,lookahead 和 lookbehind 斷言對於 REGEXP_SUBSTR 將非常有用。例如,您可以通過執行以下語句返回 Customers 表的 Address 列中街道名稱(不帶街道編號)的列表:

SELECT REGEXP_SUBSTR( Street,'(?<=^\\S+\\s+).*$' ) 
FROM Customers;

另一個示例:假定您想要使用正則表示式來驗證口令是否符合某些規則。您可以使用類似於下面內容的零寬度斷言:

IF password REGEXP '(?=.*[[:digit:]])(?=.*[[:alpha:]].*[[:alpha:]])[[:word:]]{4,12}' 
 MESSAGE 'Password conforms' TO CLIENT;
ELSE
 MESSAGE 'Password does not conform' TO CLIENT;
END IF

當滿足以下條件時,口令有效:

  • password 至少有一位數(零寬度肯定斷言 [[:digit:]])

  • password 至少有兩個字母字元(零寬度肯定斷言 [[:alpha:]].*[[:alpha:]])

  • password 只含有字母數字字元或下劃線字元 ([[:word:]])

  • password 最少含有 4 個字元,最多含有 12 個字元 ({4,12})

下表包含 SQL Anywhere 支援的斷言:

語法 含義
(?=pattern) 肯定的 lookahead 零寬度斷言 檢視字串中的當前位置是否緊跟著出現了 pattern,而 pattern 不會成為匹配字串的一部分。'A(?=B)' 匹配後面跟有 B 的 A,但不使 B 成為匹配的一部分。

例如,SELECT REGEXP_SUBSTR( 'in new york city','new(?=\\syork)'); 會返回子串 new,因為它後面緊跟著 ' york'(請注意 york 前面的空格)。

(?!pattern) 否定的 lookahead 零寬度斷言 檢視字串中的當前位置是否沒有 緊跟著出現 pattern,而 pattern 不會成為匹配字串的一部分。所以,'A(?!B)' 匹配後面未跟著 B 的 A。

例如,SELECT REGEXP_SUBSTR('new jersey','new(?!\\syork)'); 會返回子串 new。

(?<=pattern) 肯定的 lookbehind 零寬度斷言 檢視字串中的當前位置是否前面緊挨著出現了 pattern,而 pattern 不會成為匹配字串的一部分。所以,'(?<=A)B' 匹配前面緊挨著 A 的 B,但不使 A 成為匹配的一部分。

例如,SELECT REGEXP_SUBSTR('new york','(?<=new\\s)york'); 會返回子串 york。

(?<!pattern) 否定的 lookbehind 零寬度斷言 檢視字串中的當前位置的前面是否沒有 緊挨著出現 pattern,而 pattern 不會成為匹配字串的一部分。

例如,SELECT REGEXP_SUBSTR('about york','(?<!new\\s)york'); 會返回子串 york。

(?>pattern) 所屬關係區域性子表示式 僅匹配與 pattern 匹配的剩餘字串的最大字首。

例如,在 'aa' REGEXP '(?>a*)a' 中,(?>a*) 匹配(並消耗)aa,而決不僅僅是前導 a。因此,'aa' REGEXP '(?>a*)a' 的計算結果為 false。

(?:pattern) 非捕獲塊 該語法在功能上就等效於 pattern,是為實現相容性而提供。

例如,在 'bb' REGEXP '(?:b*)b' 中,(?:b*) 匹配(並消耗)bb。但是,與所屬關係區域性子表示式不同,bb 中的最後一個 b 會被放棄,以允許整個匹配成功(即,允許與在非捕獲塊的外部找到的 b 匹配)。

同樣,'a(?:bc|b)c' 匹配 abcc 和 abc。在匹配 abc 時,bc 中最後面的 c 會發生回溯,以便可以使用組外的 c 來使匹配成功。

(?#text) 用於註釋。text 的內容會被忽略。

正則表示式示例

下表顯示正則表示式的使用示例。所有示例都適用於 REGEXP,部分示例也適用於 SIMILAR TO(如[示例]列中註釋)。結果視您用於搜尋的搜尋條件而異。對於使用 SIMILAR TO 的示例,結果還要另外根據是否區分大小寫和重音而異。

有關 REGEXP 和 SIMILAR TO 如何處理匹配和計算範圍的比較,請參見LIKE、REGEXP 和 SIMILAR TO 搜尋條件。

請注意,如果在文字字串中使用這些示例(例如,'.+@.+\\..+'),則應使用雙反斜線

示例 匹配示例
信用卡號(僅限 REGEXP):

Visa:

4[0-9]{3}\s[0-9]{4}\s[0-9]{4}\s[0-9]{4}

MasterCard:

5[0-9]{3}\s[0-9]{4}\s[0-9]{4}\s[0-9]{4}

American Express:

37[0-9]{2}\s[0-9]{4}\s[0-9]{4}\s[0-9]{4}

Discover:

6011\s[0-9]{4}\s[0-9]{4}\s[0-9]{4}

匹配 (Visa): 4123 6453 2222 1746

非匹配 (Visa):

3124 5675 4400 4567,4123-6453-2222-1746

同樣,MasterCard 匹配一組 16 位的號碼,以 5 開頭,每四位號碼組成的子集之間各有一個空格。American Express 和 Discover 是相同的,但是必須分別以 37 和 6011 開頭。

日期(REGEXP 和 SIMILAR TO 均適用):

([0-2][0-9]|30|31)/(0[1-9]|1[0-2])/[0-9]{4}

匹配: 31/04/1999,15/12/4567

非匹配: 31/4/1999,31/4/99,1999/04/19,42/67/25456

Windows 絕對路徑(僅限 REGEXP):

([A-Za-z]:|\\)\\[[:alnum:][:whitespace:]!"#$%&'()+,-.\\;=@\[\]^_`{}~.]*

匹配:\\server\share\file

非匹配:\directory\directory2,/directory2

電子郵件地址(僅限 REGEXP):

[[:word:]\-.]+@[[:word:]\-.]+\.[[:alpha:]]{2,3}

匹配:[email protected],[email protected]

非匹配:abc@dummy,ab*[email protected]

電子郵件地址(僅限 REGEXP):

.+@.+\..+

匹配:*@[email protected],__1234^%@@abc.def.ghijkl

非匹配:abc.123.*&ca,^%abcdefg123

HTML 十六進位制顏色程式碼(REGEXP 和 SIMILAR TO 均適用):

[A-F0-9]{6}

匹配:AB1234,CCCCCC,12AF3B

非匹配:123G45,12-44-CC

HTML 十六進位制顏色程式碼(僅限 REGEXP):

[A-F0-9]{2}\s[A-F0-9]{2}\s[A-F0-9]{2}

匹配:AB 11 00,CC 12 D3

非匹配:SS AB CD,AA BB CC DD,1223AB

IP 地址(僅限 REGEXP):

((2(5[0-5]|[0-4][0-9])|1([0-9][0-9])|([1-9][0-9])|[0-9])\.){3}(2(5[0-5]|[0-4][0-9])|1([0-9][0-9])|([1-9][0-9])|[0-9])

匹配: 10.25.101.216

非匹配: 0.0.0,256.89.457.02

Java 註釋(僅限 REGEXP):

/\*.*\*/|//[^\n]*

匹配位於 /* 和 */ 之間的 Java 註釋,或者字首為 // 的一行註釋。

非匹配:a=1

貨幣(僅限 REGEXP):

(\+|-)?\$[0-9]*\.[0-9]{2}

匹配: $1.00,-$97.65

非匹配: $1,1.00$,$-75.17

正數、負數和小數值(僅限 REGEXP):

(\+|-)?[0-9]+(\.[0-9]+)?

匹配: +41,-412,2,7968412,41,+41.1,-3.141592653

非匹配: ++41,41.1.19,-+97.14

口令(REGEXP 和 SIMILAR TO 均適用):

[[:alnum:]]{4,10}

匹配:abcd,1234,A1b2C3d4,1a2B3

非匹配:abc,*ab12,abcdefghijkl

口令(僅限 REGEXP):

[a-zA-Z]\w{3,7}

匹配:AB_cd,A1_b2c3,a123_

非匹配:*&^g,abc,1bcd

電話號碼(REGEXP 和 SIMILAR TO 均適用):

([2-9][0-9]{2}-[2-9][0-9]{2}-[0-9]{4})|([2-9][0-9]{2}\s[2-9][0-9]{2}\s[0-9]{4})

匹配: 519-883-6898,519 888 6898

非匹配: 888 6898,5198886898,519 883-6898

句子(僅限 REGEXP):

[A-Z0-9].*(\.|\?|!)

匹配:Hello,how are you?

非匹配:i am fine

句子(僅限 REGEXP):

[[:upper:]0-9].*[.?!]

匹配:Hello,how are you?

非匹配:i am fine

社保號碼(REGEXP 和 SIMILAR TO 均適用):

[0-9]{3}-[0-9]{2}-[0-9]{4}

匹配: 123-45-6789

非匹配:123 45 6789,123456789,1234-56-7891

URL(僅限 REGEXP):

(http://)?www\.[a-zA-Z0-9]+\.[a-zA-Z]{2,3}

匹配:http://www.sample.com、www.sample.com

非匹配:http://sample.com,http://www.sample.comm

到此這篇關於SQL Anywhere正則表示式語法與示例的文章就介紹到這了,更多相關SQL Anywhere正則表示式內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!