[toc]
##基本概念
正則表達式是一種文本模式,包括普通字符(例如,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"
```
### 看個例子
```
//匹配帳號是否合法(字母開頭,允許516字節,允許字母數字下劃線
```
```
var re =new RegExp("^[azAZ][azAZ09\_]{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個空格或者多個空格結尾。
### 匹配特定字符串
```
^[AZaz]+$ //匹配由26個英文字母組成的字符串
^[AZ]+$ //匹配由26個英文字母的大寫組成的字符串
^[az]+$ //匹配由26個英文字母的小寫組成的字符串
^[AZaz09]+$ //匹配由數字和26個英文字母組成的字符串
^\w+$ //匹配由數字、26個英文字母或者下劃線組成的字符串
```
- JavaScript手冊
- Array函數
- String函數
- Date函數
- Mach函數
- Regexp函數
- Location函數
- Window 函數
- Other函數
- History函數
- Navigator函數
- Event函數
- Dom函數
- Json函數
- Sea.js手冊
- JavaScript學習總結
- 1.基礎部分
- 2.對象部分
- 3.BOM和DOM詳解
- 4.function函數部分
- 5.原型和原型鏈詳解
- 6.數據類型和JSON格式
- 7.Ajax和Http狀態字
- 8.正則表達式
- 9.事件詳解
- 前端相關網址
- 前端干貨文章
- JavaScript字符串常用的一些方法
- 前端開發知識體系
- JavaScript速成課
- 移動端開發技巧
- 移動端Web頁面問題解決方案
- 20個常用的CSS技巧
- 學習JavaScript設計模式
- 前端開發學習總結