• QQ咨詢:4001806960
  • 咨詢熱線:400-180-6960

正則詳解一

作者:日期:2018-03-31 20:40:31 點擊:626

正則

 

什麽是正則?

正則就是一個規則,用來處理字符串的規則
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) =>true
4.
5.reg=/^\d+/;
6.reg.test(str) =>false
7.
8.reg=/^\d+$/;//=>只能是某某某的,這裏說明只能是1到多個數字
9.reg.test('2017'); =>true
10.reg.test('2017珠峰2018'); =>false
11.reg.test('2'); =>true ^或者$只是一個修飾或者聲明,不會占據字符串的位置

\

1.var reg = /^2.3$/;
2.reg.test('2.3'); =>true
3.reg.test('2+3'); =>true 點在正則中的意思:匹配除了\n以外的任意字符,而不是單純的小數點
4.
5.reg = /^2\.3$/;
6.reg.test('2.3'); =>true
7.reg.test('2+3'); =>false 使用轉義字符把點轉換爲本身小數點的意思

x|y

1.var reg = /^18|19$/;//=>18 19 189 119 819 181 1819 ... 很多都符合這個規則
2./*
3. * 18或者19
4. * 以1開頭 以9結尾 中間是8或者1
5. * 以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_]$/; //=>等價于\w
3.
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 -12
3. * 整數或者小數 0 12 0.2 12.5 -12.3
4. * 只要出現小數點,後面至少要跟一位數字
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.cn
15.// @zhu-feng-pei-xun.com.cn

身份證號碼

1./*
2. * 18位
3. * 前17位必須是數字
4. * 最後一位可以是數字或者X(X代表數字10)
5. *
6. * 130828199012040617
7. * 前六位:省市縣 130828
8. * 接下來八位 出生年+月+日
9. * 倒數第二位數字 奇數代表男 偶數代表女
10. */
11.var reg = /^(\d{6})(\d{4})(\d{2})(\d{2})\d{2}(\d)(\d|X)$/;
12.//=>這樣寫不僅可以匹配,而且以後捕獲的時候,不僅可以把大正則匹配的結果捕獲到,裏面每一個小分組(小正則)匹配的結果也可以單獨的捕獲到 “分組捕獲”
13.
14.//=>年 1950~2017
15.//=>第一段 1950~1999
16.//=>第二段 2000~2017
17.//==> 00~09
18.//==> 10~17
19.// /^((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);//=>0
17.console.log(reg.exec(str)[0]);//=>'2017'
18.console.log(reg.lastIndex);//=>8
19.console.log(reg.exec(str)[0]);//=>'2018'
20.console.log(reg.lastIndex);//=>16
21.console.log(reg.exec(str));//=>null
22.console.log(reg.lastIndex);//=>0
23.console.log(reg.exec(str)[0]);//=>'2017'

上一篇: JS中的 變量提升、作用域、閉包 核心原理解讀

下一篇: git 基礎知識精講