基本概念
正規表示式是一種文字模式,包括普通字元(例如,a 到 z 之間的字母)和特殊字元(稱為「元字元」)。模式描述在搜尋文字時要匹配的一個或多個字串。
首先推薦幾個正規表示式編輯器
Debuggex :https://www.debuggex.com/
PyRegex:http://www.pyregex.com/
Regexper:http://www.regexper.com/
正規表示式是一種查找以及字串替換操作。正規表示式在文字編輯器中廣泛使用,例如正規表示式被用於:
[copy]檢查文本中是否含有指定的特徵詞
找出文中匹配特徵詞的位置
從文字中提取訊息,例如:字串的子字串
修改文字
說明:正規表示式通常用於兩種任務:1.驗證,2.搜尋/替換。用於驗證時,通常需要在前後分別加上^和$,以匹配整個待驗證字串;搜索/替換時是否加上此限定則根據搜索的要求而定,此外,也有可能要在前後加上b而不是^和$。此表所列的常用正規表示式,除個別外均未在前後加上任何限定,請根據需要,自行處理。
優先權順序
在構造正規表示式之後,就可以像數學表達式一樣來求值,也就是說,可以從左到右並按照一個優先權順序來求值。 下表從最高優先權到最低優先權列出各種正規表示式運算子的優先權順序:
操作符 | 描述 |
---|---|
转义符 | |
(), (?:), (?=), [] | 圆括号和方括号 |
*, , ?, {n}, {n,}, {n,m} | 限定符 |
^, $, anymetacharacter | 位置和顺序 |
建立正規表示式
建構正規表示式的方法和建立數學表達式的方法一樣。也就是用多種元字元與操作符將小的表達式結合在一起來創造更大的表達式。
可以透過在一對分隔符號之間放入表達式模式的各種元件來建構一個正規表示式。
對 JScript 而言,分隔符號為一對正斜線 (/) 字元。例如:
/expression/
對 VBScript 而言,則採用一對引號 ("") 來決定正規表示式的邊界。例如:
看範例
var re =new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,19}$");
if(re.test(aaaa)){
alert("格式正確");
}else{
alert("格式錯誤");
}
正規表示式的元件可以是單一的字元、字元集合、字元範圍、字元間的選擇或所有這些元件的任意組合。
常用的正規表示式
符合中文字元的正規表示式: [u4e00-u9fa5]
評註:配對中文還真是個頭痛的事,有了這個表達式就好辦了
匹配雙位元組字元(包括漢字在內):[^x00-xff]
評註:可以用來計算字串的長度(一個雙位元組字元長度計2,ASCII字元計1)
符合空白行的正規表示式:ns*r
評註:可用來刪除空白行
符合HTML標記的正規表示式:]*>.*?1>|<.>
評論:網路上流傳的版本太糟糕,上面這個也只能匹配部分,對於複雜的嵌套標記依舊無能為力
符合首尾空白字元的正規表示式:^s*|s*$
評註:可以用來刪除行首行尾的空白字元(包括空格、製表符、換頁符等等),非常有用的表達式
符合Email位址的正規表示式:w ([- .]w )*@w ([-.]w )*.w ([-.]w )*
評註:表單驗證時很實用
符合網址URL的正規表示式:[a-zA-z] ://[^s]*
評註:網路上流傳的版本功能很有限,上面這個基本上可以滿足需求
符合帳號是否合法(字母開頭,允許5-16位元組,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
評註:表單驗證時很實用
符合國內電話號碼:d{3}-d{8}|d{4}-d{7}
評註:配對形式如 0511-4405222 或 021-87888822
配對騰訊QQ號:[1-9][0-9]{4,}
評註:騰訊QQ號從10000開始
匹配中國郵遞區號:[1-9]d{5}(?!d)
評註:中國郵遞區號為6位數字
配對身分證:d{15}|d{18}
評註:中國的身分證為15位或18位
匹配ip位址:d .d .d .d
評註:提取ip位址時有用
匹配特定數字
[copy] ^[1-9]d*$ //符合正整數
^-[1-9]d*$ //符合負整數
^-?[1-9]d*$ //符合整數
^[1-9]d*|0$ //符合非負整數(正整數 0)
^-[1-9]d*|0$ //符合非正整數(負整數 0)
^[1-9]d*.d*|0.d*[1-9]d*$ //符合正浮點數
^-([1-9]d*.d*|0.d*[1-9]d*)$ //符合負浮點數
^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0 |0)$ //符合浮點數
^[1-9]d*.d*|0.d*[1-9]d*|0?.0 |0$ //符合非負浮點數(正浮點數 0)
^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0 |0$ //匹配非正浮點數(負浮點數0)
評註:處理大量資料時有用,具體應用時注意修正
匹配特定字串
[copy]^[A-Za-z] $ //符合由26個英文字母組成的字串
^[A-Z] $ //符合由26個英文字母的大寫組成的字串
^[a-z] $ //符合由26個英文字母的小寫組成的字串
^[A-Za-z0-9] $ //匹配由數字和26個英文字母組成的字串
^w $ //符合由數字、26個英文字母或底線組成的字串
評註:最基本、最常用的一些表達式
心智圖