該文章轉載自個人博客Alvin-Liu。java
JavaScript
採用的是Perl
語言正則表達式語法的一個至關完整的子集。正則表達式的模式規範是由一系列字符構成的。多數字符(包括字母數字字符)描述的都是按照字面意思進行匹配的字符。好比說 /java/ 就和全部包含子串 java
的字符串相匹配。然正則表達式中的其它字符不是按照字面意思進行匹配的,但它們都具備特殊的意義。正則表達式 /s$/ 包含兩個字符, 第一個特殊字符 s
是按照字面意思與自身相匹配。第二個字符 $
是一個特殊字符,它所匹配的是字符串的結尾。以正則表達式 /s$/ 匹配的就是以字母 s
結尾的字符串。正則表達式
在正則表達式中,許多標點符號都有特殊的含義。下面是常見字符和它們的含義數組
字符 | 描述 |
---|---|
\t | 製表符 |
\n | 換行符 |
\r | 回車符 |
\f | 換頁符 |
\b | 與回退字符 |
\v | 垂直製表符 |
\0 | 空字符 |
將直接量字符單獨放進方括號內就組成了字符類。一個字符類能夠匹配它所包含的任意字符。字符類可使用連字符來表示字符範圍。函數
/[a-zA-Z0-9]/ //匹配任意的字母和數字
字符類表:編碼
字符 | 匹配 |
---|---|
[...] | 方括號內的任意字符 |
1 | 不在方括號內的任意字符 |
. | 除了換行和回車以外的任意字符 |
\w | 單詞字符(全部的字母) |
\W | 非單詞字符 |
\s | 空白字符 |
\S | 非空白字符 |
\d | 數字字符 |
\D | 非數字字符 |
[\b] | 退格直接量(特例) |
匹配重複字符是儘量多地匹配,並且容許後續的正則表達式繼續匹配。url
重複字符語法表:spa
字符 | 含義 |
---|---|
? | 匹配前一項零次或一次 |
* | 匹配前一項零次或屢次(任意次) |
+ | 匹配前一項一次或屢次(至少一次) |
{n,m} | 匹配前一項至少n次但不超過m次 |
{n,} | 匹配前一項至少n次 |
{n} | 匹配前一項n次 |
/\d{2,4}/ //匹配2 ~ 4個數字 /\s+java\s+/ //匹配先後帶有一個或多個空格的字符串「java」
只須在「貪婪的」匹配的字符後跟隨一個問號便可: ??
,+?
,*?
或{1,5}?
。code
選擇項的嘗試匹配次序是從作左到右,直到發現了匹配項。若是左邊的選擇項匹配,就忽略右邊的匹配項,即便它產生更好的匹配。blog
正則表達式的圓括號做用:ip
一、把單獨的項組合成子表達式,以即可以像處理一個單獨的單元那樣用 |
、*
、+
或者 ?
等來對單元格內的項進行處理。
/java(script)?/ //能夠匹配字符串 java,其後能夠有 script也能夠沒有
二、在完整的模式中定義子模式。
/[a-z]+\d+/ //假定咱們關心的是每一個匹配尾部的數字 /[a-z]+(\d+)/ //就能夠從檢索的匹配中抽取數字了
三、容許在同一正則表達式的後部引用前面的子表達式。
\1 //引用的是第一個帶圓括號的子表達式, \3 //引用的是第三個帶圓括號的子表達式 , /[Jj]ava(?:[Ss]cript)?)\sis\s(fun\w*)/ //其中的 (fun\w*) 匹配的文本能夠用 \2 來引用(注意:「(?: 」 形式的分組不編碼)。
注意1: 由於子表達式能夠嵌套另外一個子表達式,因此它的位置是參與計數的左括號的位置。
/[Jj]ava([Ss]cript)?)\sis\s(fun\w*)/ //其中嵌套的子表達式 ([Ss]cript) 能夠用 \2 來指代
注意2:對正則表達式中前一個子表達式的引用,並非對子表達式的模式的引用,而指的是與那個模式相匹配的文本的引用。
/[' ''][^' '']*[' '']/
該例匹配的是單引號或雙引號以內的0個或多個字符,但不要求左側和右側的引號匹配(即,都是單引號或都是雙引號)
若是要匹配可用:
/([' ''])[^' '']*\1/
正則表達式不容許雙引號括起的內容中有單引號,反之亦然。因此下面之中寫法是非法的:
/([' ''])[^\1]*\1/
正則表達式的選擇、分組和引用字符:
字符 | 含義 |
---|---|
| | 選擇,匹配左邊或右邊的子表達式 |
(....) | 組合,將幾個項組合爲一個單元,記憶與該組匹配的字符 |
(?:...) | 組合,將項組合爲一個單元,不記憶與該組匹配的字符 |
\n | 和第n個分組第一次匹配的字符相匹配,組是圓括號中的子表達式。「(?:」形式的分組編碼 |
字符 | 含義 |
---|---|
^ | 匹配字符開頭 |
$ | 匹配字符結尾 |
\b | 匹配單詞邊界 |
\B | 匹配非單詞邊界 |
(?=p) | 零寬正向先行斷言,它斷言自身出現的位置的後面能匹配表達式p |
(?!p) | 零寬負向先行斷言,它斷言自身出現的位置的前面能匹配表達式p |
修飾符 | 描述 |
---|---|
i | 執行對大小寫不敏感的匹配 |
g | 執行全局匹配(查找全部匹配而非在找到第一個匹配後中止) |
m | 執行多行匹配 |
一、search()方法:它的參數是一個正則表達式(若是參數不是正則表達式,則首先會經過RegExp構造函數將它轉換成正則表達式),返回第一個與之匹配的子串的起始位置,若是找不到,返回 -1 ;
"JavaScript".search(/script/i); //返回4
二、replace()方法:它的第一個參數是正則表達式,第二個參數是要進行替換的字符串。若是在替換字符串中出現了 $ 加數字,那麼replace() 將用與指定的子表達式匹配的文原本替換這兩個字符。
var quote = /"([^"]*)"/g; //用中文半角引號替換英文引號,同時保持引號之間的內容(存儲在$1中)沒有被修改 text.replace(quote, '「$1」');
三、match()方法:它的參數是一個正則表達式(若是參數不是正則表達式,則首先會經過RegExp構造函數將它轉換成正則表達式),返回的是一個由匹配結果組成的數組。
var url = /(\w+):\/\/([\w.]+)\/(\s*)/; var text = "Visit my blog at http://www.limon.space/blog"; var result = text.match(url); result[0]; //包含 "Visit my blog at http://www.limon.space/blog" result[1]; //包含 "http" result[2]; //包含 "www.limon.space" result[3]; //包含 "blog"
四、split()方法:用以將調用它的字符串拆分紅一個子串組成的數組,使用的是split()的參數。
"123,456,789".split(","); //返回["123","456","789"] "1, 2, 3, 4, 5".split(/\s*,\s*/); //返回["123","456","789"]