正則表達式一直做爲個人痛點,沒有系統的學習和了解,以前部門有本500多頁的書叫《精通正則表達式》,一直沒勇氣拿起來。到後來業務中須要正則的地方愈來愈多,不忍心老找人幫忙寫正則了。找了資料先看着,至少本身先入個門。javascript
with (javascript)
java
實例化RegExp對象同實例化其餘JavaScript內置對象同樣,分別有字面量和構造函數兩種方法:正則表達式
var reg1 = /\d/g; //全局匹配數字 var reg2 = new RegExp("\\D","g"); //全局匹配非數字
相似Array/String/Function都有本身的原型方法,RexExp對象一樣有本身的原型方法。segmentfault
無論正則6不6,test方法必定都會用:RegExpObject.test(string);
string
中是否含有RegExpObject
中匹配的字符串片斷,有則返回true,不然返回false數組
/\d/g.test("abc"); //false /\d/g.test("123"); //true
這個方法很強大,可是理解起來有點難,簡單說,用法是:RegExpObject.exec(string);
這個和test同樣,返回值是返回一個數組或者null,也就是說RegExpObject
在string
中成功匹配到了字符串片斷,則返回一個數組,這個數組各項分別是:函數
[ 0: "與正則表達式匹配的文本", 1: "與正則表達式第一個分組匹配的文本", //分組就先理解爲一個括號爲一個分組 2:" 與正則表達式第二個分組匹配的文本", 3: "···以此類推" ] //來個例子: var reg1 = /([a-zA-Z]\d)+([\u4e00-\u9fa5])+/; //匹配 (大小寫字母連着一個數字) 至少一次 (再連着漢字) 至少一次 var str1 = "a11B2老cd3李e45好"; var result = reg1.exec(str1); console.log(result); //["B2老", "B2", "老"]
例子中正則匹配數字的結果是"B2老"
;因此結果數組中第一個元素爲"B2老"
,第一個分組是(大小寫字母連着一個數字),第二個元素就是"B2"
,第二個分組是漢字,第三個元素就是"老"
。同時,這裏有幾個重點要劃:學習
返回結果的數組自帶另外兩個屬性:index
:匹配成功字符串片斷的起始index; input
:存放被檢測的字符串,也就是例子中的str1;code
若是整個正則沒有匹配結果,僅僅其中某個分組有匹配結果,則exec的返回值爲null。因此test
方法也可使用RegExpObject.exec(string) != null;
來替代;對象
若是其中某個分組有多個匹配結果,例如:咱們str1改"a1B2老cd3李e45好";
那麼 (大小寫字母連着一個數字)
這個分組就有多個匹配結果,a1
和B2
;那麼返回到數組中的是最後一個匹配成功的結果,也就是B2;ip
若是正則是一個全局的正則表達式(global);那麼返回值數組會首先取第一段匹配成功的結果輸出,而後第二次執行會取第二段,依次循環類推,例如:
var reg2 = /([a-zA-Z]\d)+([\u4e00-\u9fa5])+/g; //匹配 (大小寫字母連着一個數字) 至少一次 (再連着漢字) 至少一次 var str2 = "a11B2老cd3李e45好"; var result1 = reg2.exec(str2); var result2 = reg2.exec(str2); var result3 = reg2.exec(str2); console.log(result1,result2,result3); //輸出: ["B2老", "B2", "老"] //index: 3 ["d3李", "d3", "李"] //index: 7 null
方法同Object
的toString
方法;將RegExp對象轉爲字符串。
var reg3 = /\d/g; var reg4 = new RegExp("\\d","g"); reg3.toString(); //"/\d/g" reg4.toString(); //"/\d/g"
global:
只讀,簡寫g;
被設置則表示全局搜索,即在字符串中查找到全部匹配條件的字符串片斷,不設置的話匹配到第一個成功的即中止;
ignoreCase:
只讀,簡寫i;
不區分大小寫;
multiline:
只讀,簡寫m;
多行匹配,字符串中帶有換行符時,若是不設置i
屬性,則只匹配第一行,設置後全部行均匹配且每行的開頭/結尾能夠做爲開頭/結尾被匹配(^/$
);
source:
只讀,返回正則表達式的文本,簡單說,上例中的正則表達式/([a-zA-Z]\d)+([\u4e00-\u9fa5])+/gim
,去掉兩邊的斜槓和斜槓外的東西//gim
,結果就是([a-zA-Z]\d)+([\u4e00-\u9fa5])+
;
lastIndex:
讀寫,在全局正則表達式的前提下,上一次匹配成功的文本片斷的最後一個字符以後一個文本的位置,也是下一次匹配的起始位置,初始爲0,無匹配結果時置爲0。例:
var reg5 = /\d/g; var str5 = "a1bc2e3fj"; console.log(reg5.lastIndex); //0 console.log(reg5.test(str5), reg5.lastIndex); //true 2 console.log(reg5.test(str5), reg5.lastIndex); //true 5 console.log(reg5.test(str5), reg5.lastIndex); //true 7 console.log(reg5.test(str5), reg5.lastIndex); //false 0 console.log(reg5.test(str5), reg5.lastIndex); //true 2 console.log(reg5.test(str5), reg5.lastIndex); //true 5
在第5行中,結果爲false,由於第四行中的匹配成功後,lastIndex爲7,也就是下一次是從f開始匹配,因此匹配失敗,返回false,並把lastIndex置爲0