您好,登錄后才能下訂單哦!
本篇內容主要講解“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 的重復項。與使用數學表達式一樣,您使用組合來控制正則表達式各部分的計算順序。 |
{ 和 } | 當左大括號和右大括號用于指定量詞時,它們為元字符。量詞指定一個模式要構成某個匹配所必須重復的次數。例如:
|
\ | 反斜線被用作元字符的轉義字符。它也可被用于轉義非元字符。 |
^ | 對于 REGEXP 和 REGEXP_SUBSTR,當脫字符在字符類的外部時,脫字符匹配字符串的開頭字符。例如,'^[hc]at' 匹配 hat 和 cat,但只在字符串的開頭。當用在字符類內部時,以下行為適用:
|
$ | 當與 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 以查找任何名稱為兩個詞的城市: | Y |
[:upper:] | 匹配當前歸類中的大寫字母字符。例如,'[[:upper:]ab]' 與以下其中一項匹配:任何大寫字母、a 或 b。 | Y |
[:whitespace:] | 匹配一個空白字符,例如,空格、制表符、換頁符和回車符。 | Y |
[:ascii:] | 匹配任何七位的 ASCII 字符(0 到 127 之間的順序值)。 | |
[:blank:] | 匹配一個空白區或水平制表符。
| |
[:cntrl:] | 匹配順序值小于 32 或字符值為 127 的 ASCII 字符(控制字符)。控制字符包括換行符、換頁符、退格符,等等。 | |
[:graph:] | 匹配打印字符。
| |
[:print:] | 匹配打印字符和空格。
| |
[:punct:] | 匹配其中一個字符: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~.
| |
[:word:] | 匹配當前歸類中的字母、數字或下劃線字符。
| |
[: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 結尾的所有電話號碼: \d 既可用在字符類的內部也可用在字符類的外部,等效于 |
\D | 匹配數字以外的任何字符。它的作用與 \d 正好相反。 \D 既可用在字符類的內部也可用在字符類的外部,等效于 在方括號內使用取非速記時請務必謹慎。 |
\e | 匹配轉義字符。 |
\E | 將由 \Q 啟動的將元字符視為非元字符這一功能停止。 有關正則表達式元字符的列表,請參見正則表達式:元字符。 |
\f | 匹配換頁符。 |
\n | 匹配換行符。 |
\Q | 將所有元字符視為非元字符,直到遇到 \E。例如,\Q[$\E 等效于 \[\$ 。有關正則表達式元字符的列表,請參見正則表達式:元字符。 |
\r | 匹配回車符。 |
\s | 匹配一個被視為白空格的空格或字符。例如,以下語句從 Products.ProductName 中返回名稱中至少有一個空格的所有產品名: \s 既可用在字符類的內部也可用在字符類的外部,等效于 |
\S | 匹配非白空格字符。它的作用與 \d 正好相反,而等效于 [^[:whitespace:]] 。\S 既可用在字符類的內部也可用在字符類的外部。請參見正則表達式:特殊子字符類。 在方括號內使用取非速記時請務必謹慎。 |
\t | 匹配水平制表符。 |
\v | 匹配垂直制表符。 |
\w | 匹配當前歸類中的字母字符、數字或下劃線。例如,以下語句從 Contacts.Surname 返回長度正好為七個字母數字字符的所有姓: \w 既可用在字符類的內部也可用在字符類的外部。請參見正則表達式:特殊子字符類。 等效于 |
\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 成為匹配的一部分。例如, |
(?!pattern) | 否定的 lookahead 零寬度斷言 查看字符串中的當前位置是否沒有 緊跟著出現 pattern,而 pattern 不會成為匹配字符串的一部分。所以,'A(?!B)' 匹配后面未跟著 B 的 A。例如, |
(?<=pattern) | 肯定的 lookbehind 零寬度斷言 查看字符串中的當前位置是否前面緊挨著出現了 pattern,而 pattern 不會成為匹配字符串的一部分。所以,'(?<=A)B' 匹配前面緊挨著 A 的 B,但不使 A 成為匹配的一部分。例如, |
(?<!pattern) | 否定的 lookbehind 零寬度斷言 查看字符串中的當前位置的前面是否沒有 緊挨著出現 pattern,而 pattern 不會成為匹配字符串的一部分。 例如, |
(?>pattern) | 所屬關系局部子表達式 僅匹配與 pattern 匹配的剩余字符串的最大前綴。 例如,在 |
(?:pattern) | 非捕獲塊 該語法在功能上就等效于 pattern,是為實現兼容性而提供。 例如,在 同樣, |
(?#text) | 用于注釋。text 的內容會被忽略。 |
正則表達式示例
下表顯示正則表達式的使用示例。所有示例都適用于 REGEXP,部分示例也適用于 SIMILAR TO(如[示例]列中注釋)。結果視您用于搜索的搜索條件而異。對于使用 SIMILAR TO 的示例,結果還要另外根據是否區分大小寫和重音而異。
有關 REGEXP 和 SIMILAR TO 如何處理匹配和計算范圍的比較,請參見LIKE、REGEXP 和 SIMILAR TO 搜索條件。
請注意,如果在文字字符串中使用這些示例(例如,'.+@.+\\..+'
),則應使用雙反斜線
示例 | 匹配示例 |
---|---|
信用卡號(僅限 REGEXP): Visa:
MasterCard:
American Express:
Discover:
| 匹配 (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 均適用):
| 匹配: 31/04/1999, 15/12/4567 非匹配: 31/4/1999, 31/4/99, 1999/04/19, 42/67/25456 |
Windows 絕對路徑(僅限 REGEXP):
| 匹配:\\server\share\file 非匹配:\directory\directory2, /directory2 |
電子郵件地址(僅限 REGEXP):
| 匹配:abc.123@def456.com, _123@abc.ca 非匹配:abc@dummy, ab*cd@efg.hijkl |
電子郵件地址(僅限 REGEXP):
| 匹配:*@qrstuv@wxyz.12345.com, __1234^%@@abc.def.ghijkl 非匹配:abc.123.*&ca, ^%abcdefg123 |
HTML 十六進制顏色代碼(REGEXP 和 SIMILAR TO 均適用):
| 匹配:AB1234, CCCCCC, 12AF3B 非匹配:123G45, 12-44-CC |
HTML 十六進制顏色代碼(僅限 REGEXP):
| 匹配:AB 11 00, CC 12 D3 非匹配:SS AB CD, AA BB CC DD, 1223AB |
IP 地址(僅限 REGEXP):
| 匹配: 10.25.101.216 非匹配: 0.0.0, 256.89.457.02 |
Java 注釋(僅限 REGEXP):
| 匹配位于 /* 和 */ 之間的 Java 注釋,或者前綴為 // 的一行注釋。 非匹配:a=1 |
貨幣(僅限 REGEXP):
| 匹配: $1.00, -$97.65 非匹配: $1, 1.00$, $-75.17 |
正數、負數和小數值(僅限 REGEXP):
| 匹配: +41, -412, 2, 7968412, 41, +41.1, -3.141592653 非匹配: ++41, 41.1.19, -+97.14 |
口令(REGEXP 和 SIMILAR TO 均適用):
| 匹配:abcd, 1234, A1b2C3d4, 1a2B3 非匹配:abc, *ab12, abcdefghijkl |
口令(僅限 REGEXP):
| 匹配:AB_cd, A1_b2c3, a123_ 非匹配:*&^g, abc, 1bcd |
電話號碼(REGEXP 和 SIMILAR TO 均適用):
| 匹配: 519-883-6898, 519 888 6898 非匹配: 888 6898, 5198886898, 519 883-6898 |
句子(僅限 REGEXP):
| 匹配:Hello, how are you? 非匹配:i am fine |
句子(僅限 REGEXP):
| 匹配:Hello, how are you? 非匹配:i am fine |
社保號碼(REGEXP 和 SIMILAR TO 均適用):
| 匹配: 123-45-6789 非匹配:123 45 6789, 123456789, 1234-56-7891 |
URL(僅限 REGEXP):
| 匹配:http://www.sample.com、www.sample.com 非匹配:http://sample.com, http://www.sample.comm |
到此,相信大家對“SQL Anywhere正則表達式語法是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。