正則表達式是構成搜索模式的字符序列。該搜索模式可用於文本搜索和文本替換操做。簡單來講,正則表達式實際上是一種規則,主要應用在檢測字符串是否符合咱們定義的規則上。程序員
一 建立正則表達式正則表達式
建立正則表達式有兩種方式,他們都返回一個正則表達式對象(RegExpObject):數組
1, 字面量方式 函數
1 var reg = /pattern/modifiers;
2, 構造函數方式學習
1 var reg = new RegExp(pattern,modifiers);
pattern 是一個字符串,指定了正則表達式的模式,他也能夠是一個其餘的正則表達式。測試
modifiers 是一個可選的字符串,包含屬性 "g"、"i" 和 "m",分別用於指定全局匹配、不區分大小寫的匹配和多行匹配。spa
注意,若是不指定全局查找,即模式g,那麼該正則表達式執行過程會在匹配到第一個符合模式要求的字符串時即中止。code
二 元字符對象
元字符是擁有特殊含義的字符,每一個元字符自己就能夠做爲一個正則表達式存在,用來匹配一個字符。blog
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之間的任何字符
6,一個特殊的:
(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"]
正則表達式在表單驗證方面有着很是重要的應用,但使用它是不少程序員的噩夢,由於建立它很容易,但讀懂它卻並不是易事,因此在學習正則表達式時除了靠死記硬背,只能考經驗的累積了。