淺入正則(一)

正則表達式一直做爲個人痛點,沒有系統的學習和了解,以前部門有本500多頁的書叫《精通正則表達式》,一直沒勇氣拿起來。到後來業務中須要正則的地方愈來愈多,不忍心老找人幫忙寫正則了。找了資料先看着,至少本身先入個門。javascript

with (javascript)java

實例化RegExp對象

實例化RegExp對象同實例化其餘JavaScript內置對象同樣,分別有字面量和構造函數兩種方法:正則表達式

var reg1 = /\d/g;                    //全局匹配數字
var reg2 = new RegExp("\\D","g");    //全局匹配非數字

RegExp對象原型方法

相似Array/String/Function都有本身的原型方法,RexExp對象一樣有本身的原型方法。segmentfault

test

無論正則6不6,test方法必定都會用:RegExpObject.test(string); string中是否含有RegExpObject中匹配的字符串片斷,有則返回true,不然返回false數組

/\d/g.test("abc");        //false
/\d/g.test("123");        //true

exec

這個方法很強大,可是理解起來有點難,簡單說,用法是:RegExpObject.exec(string);這個和test同樣,返回值是返回一個數組或者null,也就是說RegExpObjectstring中成功匹配到了字符串片斷,則返回一個數組,這個數組各項分別是:函數

[
    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",第二個分組是漢字,第三個元素就是"老"。同時,這裏有幾個重點要劃:學習

  1. 返回結果的數組自帶另外兩個屬性:index:匹配成功字符串片斷的起始index; input:存放被檢測的字符串,也就是例子中的str1;code

  2. 若是整個正則沒有匹配結果,僅僅其中某個分組有匹配結果,則exec的返回值爲null。因此test方法也可使用RegExpObject.exec(string) != null;來替代;對象

  3. 若是其中某個分組有多個匹配結果,例如:咱們str1改"a1B2老cd3李e45好";那麼 (大小寫字母連着一個數字) 這個分組就有多個匹配結果,a1B2;那麼返回到數組中的是最後一個匹配成功的結果,也就是B2;ip

  4. 若是正則是一個全局的正則表達式(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

toString

方法同ObjecttoString方法;將RegExp對象轉爲字符串。

var reg3 = /\d/g;
var reg4 = new RegExp("\\d","g");
reg3.toString();            //"/\d/g"
reg4.toString();            //"/\d/g"

RegExp對象屬性

  1. global: 只讀,簡寫g;被設置則表示全局搜索,即在字符串中查找到全部匹配條件的字符串片斷,不設置的話匹配到第一個成功的即中止;

  2. ignoreCase: 只讀,簡寫i;不區分大小寫;

  3. multiline: 只讀,簡寫m;多行匹配,字符串中帶有換行符時,若是不設置i屬性,則只匹配第一行,設置後全部行均匹配且每行的開頭/結尾能夠做爲開頭/結尾被匹配(^/$);

  4. source: 只讀,返回正則表達式的文本,簡單說,上例中的正則表達式/([a-zA-Z]\d)+([\u4e00-\u9fa5])+/gim,去掉兩邊的斜槓和斜槓外的東西//gim,結果就是([a-zA-Z]\d)+([\u4e00-\u9fa5])+

  5. 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


淺入正則(二):字符的含義和使用

相關文章
相關標籤/搜索