正則表達式是構成搜索模式的字元序列。該搜索模式可用於文本搜索和文本替換操作。簡單來說,正則表達式其實是一種規則,主要應用在檢測字元串是否符合我們定義的規則上。 一 創建正則表達式 創建正則表達式有兩種方式,他們都返回一個正則表達式對象(RegExpObject): 1, 字面量方式 2, 構造函數方 ...
正則表達式是構成搜索模式的字元序列。該搜索模式可用於文本搜索和文本替換操作。簡單來說,正則表達式其實是一種規則,主要應用在檢測字元串是否符合我們定義的規則上。
一 創建正則表達式
創建正則表達式有兩種方式,他們都返回一個正則表達式對象(RegExpObject):
1, 字面量方式
1 var reg = /pattern/modifiers;
2, 構造函數方式
1 var reg = new RegExp(pattern,modifiers);
pattern 是一個字元串,指定了正則表達式的模式,他也可以是一個其他的正則表達式。
modifiers 是一個可選的字元串,包含屬性 "g"、"i" 和 "m",分別用於指定全局匹配、不區分大小寫的匹配和多行匹配。
註意,如果不指定全局查找,即模式g,那麼該正則表達式執行過程會在匹配到第一個符合模式要求的字元串時即停止。
二 元字元
元字元是擁有特殊含義的字元,每個元字元本身就可以作為一個正則表達式存在,用來匹配一個字元。
1,\d 匹配0-9的任何數字
2,\D 匹配任何非數字字元
3,\w 匹配任何單詞字元,A-Z,a-z,0-9和下劃線_
4,\W 匹配任何非單詞字元
5,\s 匹配空白字元,例如空格,換行。製表符等
6,\S 匹配任何非空字元
7,.(點) 匹配除了換行和行結束符外的任何字元
8,\b 匹配單詞邊界
9,\B 匹配非單詞邊界
三 範圍查找
很多時候我們並不只是想匹配一個確定的字元,而是希望匹配在一個範圍內的字元,這時就需要用到正則表達式中的範圍查找了,範圍查找使用方括弧[]。
1,[abc] 匹配在方括弧內出現的字元
2,[^abc] 匹配在方括弧內沒有出現的字元
4,[0-9] 匹配0到9的任何數字,等同於\d
5,[a-z] 匹配a到z之間的任何字元
5,一個特殊的:
(a-z|0-9) 匹配a-z的字元或者0-9的數字
請註意,上面所提到的元字元和範圍查找實際都只匹配單個字元。若果要匹配多個字元怎麼辦呢?這就需要下麵講到的量詞了。
四 量詞
1,x+ 匹配1個或多個x
2,x* 匹配0個或多個x
3,x? 匹配0個或1個x
4,x{n} 匹配n個x
5,x{m,n} 匹配m到n之間的數字個x(包含m個和n個)
6,x{m,} 匹配至少m個x
7,x$ 匹配以x結尾
8,^x 匹配以x開頭
五 方法
正則表達式有兩個常用的方法:
1,test()
檢查指定字元串是否符合正則表達式的匹配規則,返回true或者false。
下麵是一個驗證座機號碼的測試:
1 var reg = /0\d{2,3}-\d{7,8}/g; 2 console.log(reg.test("010-1234567")); 3 reg.lastIndex = 0; 4 console.log(reg.test("0111-12345678")); 5 reg.lastIndex = 0; 6 console.log(reg.test("021-123456")); 7 reg.lastIndex = 0; 8 console.log(reg.test("21-12345678")); 9 /* 10 true 11 true 12 false 13 false 14 */
如果不把reg.lastIndex屬性設置為0,檢測同一個字元串時將出現一次true一次false迴圈出現的情況。
2,exec()
檢查字元串(子串)是否存在於被檢測字元串,返回一個數組,包含被找到的值,並確定其位置。如果沒有找到,則返回null。exec()方法返回的數組不只包含數組元素和length屬性,還包括index和input兩個屬性,input表示被檢索的字元串本身,index表示匹配到的第一個字元的位置。
另外,你可能已經有一個疑問了,上面的reg.lastIndex是什麼鬼?原來,當正則表達式指定了全局匹配時,驗證行為就變得稍微複雜一些了。lastIndex是正則表達式的一個屬性,值是一個整數,執行檢測時,程式將從 lastIndex 屬性指定的字元處開始檢索字元串 ,lastIndex屬性預設是0,即從數組開頭檢索。當找到了與表達式相匹配的文本後,它將把lastIndex 屬性設置為匹配文本的最後一個字元的下一個位置。這就是說,您可以通過反覆調用檢測方法來遍歷字元串中的所有匹配文本。當方法再也找不到匹配的文本時,它將返回 null,並把 lastIndex 屬性重置為 0。
1 var str = "hello world, hello everybody."; 2 var patt = new RegExp("hello","g"); 3 var result; 4 while (true) { 5 result = patt.exec(str); 6 if(result){ 7 //列印lastIndex屬性 8 console.log(patt.lastIndex); 9 }else{ 10 break ; 11 } 12 } 13 /* 14 0 表示第一次出現的“hello”的第一個字元的位置 15 5 表示第一次出現的“hello”的最後一個字元的下一個位置 16 13 表示第二次出現的“hello”的第一個字元的位置 17 18 表示第二次出現的“hello”的最後一個字元的下一個位置 18 */
六 支持正則表達式的字元串方法
1,replace()
替換匹配到的所有項,需要全局模式g。
1 var str = "hello world,hello everybody"; 2 str = str.replace(/hello/g,"hi"); 3 console.log(str);//"hi world,hi everybody"
2,split()
用匹配到的字元作為分隔符分隔字元串。
1 var str = "what is your name?"; 2 str = str.split(/\s+/); 3 console.log(str);//["what","is","your","name?"];
3,search()
返回字元串中第一個匹配到的字元串的位置,該方法總是忽略lastIndex屬性和全局模式g,所以他總是從開頭查找,總是返回第一個出現的位置。
1 var str = "what is your name?"; 2 var index = str.search(/a/g); 3 console.log(index);//2
4,match()
以數組形式返回被匹配到的所有項,需要全局模式g才能返回所有的。
1 var str = "hello world,hello everybody."; 2 var arr = str.match(/ll/g); 3 console.log(arr);//["ll","ll"]
正則表達式在表單驗證方面有著非常重要的應用,但使用它是很多程式員的噩夢,因為創建它很容易,但讀懂它卻並非易事,所以在學習正則表達式時除了靠死記硬背,只能考經驗的累積了。