> 轉載地址:https://segmentfault.com/a/1190000000699097
> 這篇文章本來很早就要寫的,拖了挺久的,現在整理下,供大家學習交流哈!

## 基本概念
正則表達式是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為“元字符”)。模式描述在搜索文本時要匹配的一個或多個字符串。
首先推薦幾個正則表達式編輯器
Debuggex :https://www.debuggex.com/
PyRegex:http://www.pyregex.com/
Regexper:http://www.regexper.com/
正則表達式是一種查找以及字符串替換操作。正則表達式在文本編輯器中廣泛使用,比如正則表達式被用于:
檢查文本中是否含有指定的特征詞
找出文中匹配特征詞的位置
從文本中提取信息,比如:字符串的子串
## 修改文本
說明:正則表達式通常用于兩種任務:1.驗證,2.搜索/替換。用于驗證時,通常需要在前后分別加上^和$,以匹配整個待驗證字符串;搜索/替換時是否加上此限定則根據搜索的要求而定,此外,也有可能要在前后加上\b而不是^和$。此表所列的常用正則表達式,除個別外均未在前后加上任何限定,請根據需要,自行處理。
### 優先權順序
在構造正則表達式之后,就可以象數學表達式一樣來求值,也就是說,可以從左至右并按照一個優先權順序來求值。 下表從最高優先級到最低優先級列出各種正則表達式操作符的優先權順序:
操作符 描述
\ 轉義符
(), (?:), (?=), [] 圓括號和方括號
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \anymetacharacter 位置和順序
字符類匹配
字符 匹配
[...] 方括號內的任意字符
1 不在方括號內的任意字符
. 除了換行符和其他Unicode行終止符之外的任意字符
\w 任何ASCII字符組成的單詞,等價于[a-zA-Z0-9]
\W 任何不是ASCII字符組成的單詞,等價于2
\s 任何Unicode空白符
\S 任何非Unicode空白符的字符
\d 任何ASCII數字,介于[0-9]
\D 除了ASCII數字之外的任何字符,等價于3
\b 退格直接量
重復字符匹配
字符 匹配
{n,m} 匹配前一項至少n次,但不能超過m次
{n,} 匹配前一項n次或更多次
{n} 匹配前一項n次
? 匹配前一項0次或者1次,也就是說前一項是可選的,等價于{0,1}
+ 匹配前一項1次或多次,等價于{1,}
* 匹配前一項0次或多次,等價于{0,}
字符類:錨字符 匹配
元字符/元符號 匹配
$ 匹配字符串的結尾,在多行檢索中,匹配一行的結尾
^ 匹配字符串的開頭,在多行檢索中,匹配一行的開頭
\A 只有匹配字符串開始處
\b 匹配單詞邊界,詞在 []內時無效
\B 匹配非單詞邊界
\G 匹配當前搜索的開始位置
\Z 匹配字符串結束處或行尾
\z 只匹配字符串結束處
字符類:記錄字符 匹配
元字符/元符號 匹配情況
(string) 用于反向引用的分組
\1 或$1 匹配第一個分組中的內容
\2 或$2 匹配第二個分組中的內容
\3 或$3 匹配第三個分組中的內容
正則表達式修飾符
字符 含義
i 執行不區分大小寫的匹配
g 執行一個全局匹配,即找到所有匹配而非一次匹配
m 多行匹配模式,^匹配一行的開頭和字符串開頭,$匹配行的結束和字符串的結尾
RegExp的方法
RegExp 對象有 3 個方法:test()、exec() 以及 compile()。
test():檢索字符串中的指定值。返回值是布爾值。
exec():返回一個數組,數組中的第一個條目是第一個匹配,其他的是反向引用
compile() 既可以改變檢索模式,也可以添加或刪除第二個參數。
String 對象中的正則表達式方法
方法 含義
match(pattern) 返回 pattern 中的子串或 null
replace(pattern, replacement) 用 replacement 替換 pattern
search(pattern) 返回字符串中 pattern 開始位置
split(pattern) 返回字符串按指定 pattern 拆分的數組
建立正則表達式
構造正則表達式的方法和創建數學表達式的方法一樣。也就是用多種元字符與操作符將小的表達式結合在一起來創建更大的表達式。
可以通過在一對分隔符之間放入表達式模式的各種組件來構造一個正則表達式。
對 js 而言,分隔符為一對正斜杠 (/) 字符。例如:
/expression/
對 VBScript 而言,則采用一對引號 ("") 來確定正則表達式的邊界。例如:
"expression"
看個例子
//匹配帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線
var re =new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,19}$");
`if(re.test(aaaa)){
alert("格式正確");
}else{
alert("格式錯誤");
}
正則表達式的組件可以是單個的字符、字符集合、字符范圍、字符間的選擇或者所有這些組件的任意組合。
match 方法
/*使用 match 方法獲取獲取匹配數組*/
var pattern = /box/ig;//全局搜索
var str = 'This is a Box!,That is a Box too';
alert(str.match(pattern)); //匹配到兩個 Box,Box
console.log(str.match(pattern).length);//獲取數組的長度
search方法
/*使用 search 來查找匹配數據*/
var pattern = /box/ig;
var str = 'This is a Box!,That is a Box too';
console.log(str.search(pattern));//查找到返回位置,否則返回 -1
PS:因為 search 方法查找到即返回,也就是說無需 g 全局
replace方法
/*使用 replace 替換匹配到的數據*/
var pattern = /box/ig;
var str = 'This is a Box!,That is a Box too';
console.log(str.replace(pattern, 'Cat'));//將 Box 替換成了 Cat
split方法
/*使用 split 拆分成字符串數組*/
var pattern = / /ig;
var str = 'This is a Box!,That is a Box too';
console.log(str.split(pattern));//將空格拆開分組成數組
exec方法
/* 統計子字符串出現的所有位置*/
function count(str){
var b,r=/def/g;
while(b = r.exec(str)){
console.log(b);
}
}
count('abcdefabcdefabcdefabcdef');
輸出:
[ 'def', index: 3, input: 'abcdefabcdefabcdefabcdef' ]
[ 'def', index: 9, input: 'abcdefabcdefabcdefabcdef' ]
[ 'def', index: 15, input: 'abcdefabcdefabcdefabcdef' ]
[ 'def', index: 21, input: 'abcdefabcdefabcdefabcdef' ]
正則表達式選擇
一個正則表達式選擇包含1個或多個正則表達式序列。這些序列被豎線(|)字符分隔。如果這些序列中的任何一項符合匹配條件,那么這個選擇就被匹配。他會按順序依次匹配
"into".match(/in | int/);
以上將在into中匹配in。但他不會匹配int,因為in已經匹配成功了。
正則表達式轉義
\ / [ ] () { } ? + * | . ^ $
如果希望按字面去匹配上面的字符,那么必須用一個\前綴來進行轉義。\前綴不能使字母或數字字面化。
\f : 換頁符
\n : 換行符
\r : 回車符
\t : 制表(tab)符
\^ 匹配 ^ 符號本身
\$ 匹配 $ 符號本身
\. 匹配小數點(.)本身
實例
String.prototype.trim = function () {
return this.replace(/(^\s*)|(\s*$)/g,'');
};
^表示字符串必須以后面的規則開頭,而(^\s*) 表示的就是以0個空格或者多個空格開頭,后面的(\s*$) 的意思就是, 以0個空格或者多個空格結尾。
匹配特定字符串
^[A-Za-z]+$ //匹配由26個英文字母組成的字符串
^[A-Z]+$ //匹配由26個英文字母的大寫組成的字符串
^[a-z]+$ //匹配由26個英文字母的小寫組成的字符串
^[A-Za-z0-9]+$ //匹配由數字和26個英文字母組成的字符串
^\w+$ //匹配由數字、26個英文字母或者下劃線組成的字符串
評注:最基本也是最常用的一些表達式
思維導圖
... ?
a-zA-Z0-9 ?
0-9 ?