JavaScript正則表達式

該文章轉載自個人博客Alvin-Liujava

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 執行多行匹配

模式匹配String方法:

一、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"]

  1. ...
相關文章
相關標籤/搜索