正則
什麽是正則?
正則就是一個規則,用來處理
字符串
的規則
1、正則匹配
編寫一個規則,驗證某個字符串是否符合這個規則,正則匹配使用的是 test 方法2、正則捕獲
編寫一個規則,在一個字符串中把符合規則的內容都獲取到,正則捕獲使用的方法:正則的exec方法、字符串中的split、replace、match等方法都支持正則
1.var reg = /^$/; //=>兩個斜杠中間包含一些內容就是正則,兩個斜杠之間包含的全部內容都是元字符
正則的元字符和修飾符
任何一個正則都是由 元字符 和 修飾符 組成的
修飾符
g(global):全局匹配
i(ignoreCase):忽略大小寫匹配
m(multiline):多行匹配
元字符
[量詞元字符]
+:讓前面的元字符出現一到多次
?:出現零到一次
*:出現零到多次
{n}:出現n次
{n,}:出現n到多次
{n,m}:出現n到m次
[特殊意義的元字符]
\:轉義字符(把一個普通字符轉變爲有特殊意義的字符,或者把一個有意義字符轉換爲普通的字符)
.:除了\n(換行符)以外的任意字符
\d:匹配一個0~9之間的數字
\D:匹配任意一個非0~9之間的數字(大寫字母和小寫字母的組合正好是反向的)
\w:匹配一個 0~9或字母或_
之間的字符
\s:匹配一個任意空白字符
\b:匹配一個邊界符
x|y:匹配x或者y中的一個
[a-z]:匹配a-z中的任意一個字符
[^a-z]:和上面的相反,匹配任意一個非a-z的字符
[xyz]:匹配x或者y或者z中的一個字符
[^xyz]:匹配除了xyz以外的任意字符
():正則的小分組,匹配一個小分組(小分組可以理解爲大正則中的一個小正則)
^:以某一個元字符開始
$:以某一個元字符結束
?::只匹配不捕獲
?=:正向預查
?!:負向預查
……
除了以上特殊元字符和量詞元字符,其余的都叫做普通元字符:代表本身意義的元字符
元字符詳細解讀
^ $
1.var reg = /\d+/; //=>包含某某某即可,這裏說明包含1到多個數字即可2.var str = '珠峰2017培訓2018';3.reg.test(str) =>true4.5.reg=/^\d+/;6.reg.test(str) =>false7.8.reg=/^\d+$/;//=>只能是某某某的,這裏說明只能是1到多個數字9.reg.test('2017'); =>true10.reg.test('2017珠峰2018'); =>false11.reg.test('2'); =>true ^或者$只是一個修飾或者聲明,不會占據字符串的位置
\
1.var reg = /^2.3$/;2.reg.test('2.3'); =>true3.reg.test('2+3'); =>true 點在正則中的意思:匹配除了\n以外的任意字符,而不是單純的小數點4.5.reg = /^2\.3$/;6.reg.test('2.3'); =>true7.reg.test('2+3'); =>false 使用轉義字符把點轉換爲本身小數點的意思
x|y
1.var reg = /^18|19$/;//=>18 19 189 119 819 181 1819 ... 很多都符合這個規則2./* 3. * 18或者194. * 以1開頭 以9結尾 中間是8或者15. * 以18開頭或者以19結尾即可 =>'18珠峰' '珠峰19'...6. */7.8.var reg = /^(18|19)$/;//=>此時只有18或者19符合我們的規則了
()
:正則中的分組,也可以理解爲一個大正則中的一個正則(包起來的部分是一個整體);在正則中我們可以使用小括號改變一些默認的優先級
;小分組還有第二個作用:
分組引用
小分組的第三個作用:分組捕獲
1.//=>分組引用:\1 或者 \2 ...出現和第N個分組一模一樣的內容2.var reg = /^([a-z])([a-z])\2([a-z])$/; //=> 符合的字符串:foot、book、week、attr、http...
[]
[xyz] [^xyz] [a-z] [^a-z]
1.//=>\w:數組字母下劃線中的任意一個字符2.var reg = /^[a-zA-Z0-9_]$/; //=>等價于\w3.4.//=>中括號中出現的元字符,一般都代表本身的含義5.var reg = /^[.?+&]+$/; //=>裏面的四個元字符都是本身含義,例如:點就是小數點了,不是所謂的任意字符...6.7.//=>需求:描述樣式類名的規則(數字、字母、下劃線、-),並且不能以-開頭8.//var reg = /^[\w-]+$/;9.//var reg = /^[0-9a-zA-Z_-]+$/; //=>沒有處理以-開頭的情況10.var reg = /^\w[\w-]*$/;
1.//=>需求:驗證18~65之間的年齡2.//var reg = /^[18-65]$/; //=>1或者8~6或者5中的任意一個字符,中括號中出現的18不是數字18,而是1或者8,當前正則是非法的:因爲不能設置8~6這種範圍3.4.//=>分三個階段處理:5.// 18 或者 19 /(18|19)/6.// 20 ~ 59 /([2-5]\d)/7.// 60 ~ 65 /(6[0-5])/8.var reg = /^((18|19)|([2-5]\d)|(6[0-5]))$/;
常用的正則表達式編寫
驗證是否爲有效數字
1./* 2. * 可能是正數,可能是負數 12 -123. * 整數或者小數 0 12 0.2 12.5 -12.34. * 只要出現小數點,後面至少要跟一位數字5. * 小數點前面必須有數字6. */7.var reg = /^-?(\d|([1-9]\d+))(\.\d+)?$/;8./* 9. * -? 負號可有可無10. * (\d|([1-9]\d+))11. * \d 一位數可以是任何值12. * ([1-9]\d+) 多位數不能以零開頭13. * (\.\d+)? 小數部分可有可無,有的話點後面必須跟一位數字14. */
手機號碼
1./* 2. * 11位數字3. * 1開頭4. */5.var reg = /^1\d{10}$/;
用戶名:真實姓名
1.//=>/^[\u4E00-\u9FA5]$/ 中文漢字的正則2.var reg = /^[\u4E00-\u9FA5]{2,10}(·[\u4E00-\u9FA5]{2,10})?$/;
郵箱
1.var reg = /^\w+((-\w+)|(\.\w+))*@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;2./* 3. * 以數字字母下劃線開頭4. * @前面可以是 數字、字母、下劃線、-、. 這些符號5. * 不能把 -和. 連續出現,出現一次後面必須跟數字字母下劃線6. *7. * @後面的部分支持8. * 企業郵箱9. * .com.cn 多域名情況10. */11.// [A-Za-z0-9]+12.// ((\.|-)[A-Za-z0-9]+)*13.// \.[A-Za-z0-9]+14.// @163.com.cn15.// @zhu-feng-pei-xun.com.cn
身份證號碼
1./* 2. * 18位3. * 前17位必須是數字4. * 最後一位可以是數字或者X(X代表數字10)5. *6. * 1308281990120406177. * 前六位:省市縣 1308288. * 接下來八位 出生年+月+日9. * 倒數第二位數字 奇數代表男 偶數代表女10. */11.var reg = /^(\d{6})(\d{4})(\d{2})(\d{2})\d{2}(\d)(\d|X)$/;12.//=>這樣寫不僅可以匹配,而且以後捕獲的時候,不僅可以把大正則匹配的結果捕獲到,裏面每一個小分組(小正則)匹配的結果也可以單獨的捕獲到 “分組捕獲”13.14.//=>年 1950~201715.//=>第一段 1950~199916.//=>第二段 2000~201717.//==> 00~0918.//==> 10~1719.// /^((19[5-9]\d)|(20((0\d)|(1[0-7]))))$/
正則捕獲
把當前字符串中符合正則的字符捕獲到
RegExp.prototype:exec
實現正則捕獲的方法
1.var str = '珠峰培訓2017揚帆起航2018';2.var reg = /\d+/;3.4.reg.exec(str);5./* 6. * 當正則捕獲的時候:7. * 1、先去驗證當前字符串和正則是否匹配,如果不匹配返回的結果是null(沒有捕獲到任何的內容)8. * 2、如果匹配,從字符串最左邊開始,向右查找到匹配的內容,並且把匹配的內容返回9. *10. * exec捕獲到結果的格式:11. * -> 獲取的結果是一個數組12. * -> 數組中的第一項是當前本次大正則在字符串中匹配到的結果13. * -> index:記錄了當前本次捕獲到結果的起始索引14. * -> input:當前正則操作的原始字符串15. * -> 如果當前正則中有分組,獲取的數組中,從第二項開始都是每個小分組,本次匹配到的結果(通過exec可以把分組中的內容捕獲到)16. *17. * 執行一次exec只能把符合正則規則條件中的一個內容捕獲都,如果還有其它符合規則的,需要在次執行exec才有可能捕獲到18. */
正則捕獲存在懶惰性
執行一次exec捕獲到第一個符合規則的內容,第二次執行exec,捕獲到的依然是第一個匹配的內容,後面匹配的內容不管執行多少次exec都無法捕獲到
解決正則捕獲的懶惰性:
在正則的末尾加修飾符g(全局匹配)
1.//=>正則爲什麽會存在懶惰性?2./* 3. * 正則本身有一個屬性:lastIndex(下一次正則在字符串中匹配查找的開始索引)4. * 默認值:0,從字符串第一個字符開始查找匹配的內容5. * 默認不管指定多少遍exec方法,正則的lastIndex值都不會變(也就是第二次以後查找的時候還是從第一個字符找,所以找到的結果永遠都是第一個匹配的內容)6. * 而且當我們手動把 lastIndex 進行修改的時候,不會起到任何的作用7.*/8.9.//=>爲什麽加修飾符g就解決了懶惰性?10./* 11. * 加了修飾符g,每一次exec結束後,浏覽器默認會把lastIndex值進行修改,下一次從上一次結束的位置開始查找,所以可以得到後面匹配的內容了12. */13.14.var reg = /\d+/g;15.var str = '珠峰培訓2017楊帆起航2018';16.console.log(reg.lastIndex);//=>017.console.log(reg.exec(str)[0]);//=>'2017'18.console.log(reg.lastIndex);//=>819.console.log(reg.exec(str)[0]);//=>'2018'20.console.log(reg.lastIndex);//=>1621.console.log(reg.exec(str));//=>null22.console.log(reg.lastIndex);//=>023.console.log(reg.exec(str)[0]);//=>'2017'