JS正則表達式入門,看這篇就夠了
前言
在正文開始前,先說說正則表達式是什么,為什么要用正則表達式?正則表達式在我個人看來就是一個瀏覽器可以識別的規則,有了這個規則,瀏覽器就可以幫我們判斷某些字符是否符合我們的要求。但是,我們為什么要使用正則表達式呢?下面我們就看一下下面這個業務場景。
驗證QQ號的合法性
/*合法qq號規則:1、5-15位;2、全是數字;3、不以0開頭 *///1.在不使用正則表達式的時候,我們可能會這樣判斷QQ號的合法性 var qq="6666666a6666";
if(qq.length>=5&&qq.length<=15&&!isNaN(qq)&&qq.charCodeAt(0)!=48){ alert("QQ合法"); }else{ alert("QQ不合法") }//2.使用正則表達式 var qq="066336"; var reg=/^[1-9][0-9]{4,14}$/; if(reg.test(qq)){ alert("QQ合法"); }else{ alert("QQ不合法"); }</pre>
從上面這個例子可以看出來使用了正則表達式的時候,我們的代碼量變少了,而且比較直觀。如果遇到非常的復雜的匹配,正則表達式的優勢就更加明顯了。
使用方法
接著上面,我想先說說JS正則表達式是如何使用的。非常簡單,只有兩步而已。
第一步:定義一個正則表達式
定義正則表達式有兩種方法,第一種通過"/正則表達式/修飾符"這種形式直接寫出來,第二種通過“new RegExp('正則表達式','修飾符)'”創建一個RegExp對象。其中修飾符為可選項,有三個取值 g:全局匹配;i:不區分大小寫;m:多行匹配
//第一種“/正則表達式/” var reg1=/hello \w{3,12}/g; //第二種new RegExp('正則表達式') var reg2=new RegExp("hello \w{3,12}",'g');/*這里需要注意的是,第二種方法中由于字符串轉義問題,"\"代表"\"。 */</pre>
上面這個定義方法,其實還有一個可選參數(修飾符),這里我們先不深入探究,后面我們再細說。
說到RegExp對象,下面要說一下RegExp對象自帶的屬性,并不復雜,這里我就列一下,不展開說了。
屬性 | 描述 |
---|---|
global | RegExp 對象是否具有標志 g。 |
ignoreCase | RegExp 對象是否具有標志 i。 |
lastIndex | 一個整數,標示開始下一次匹配的字符位置。 |
multiline | RegExp 對象是否具有標志 m。 |
source | 正則表達式的源文本。 |
第二步:調用RegExp對象中的方法
RegExp對象給我們提供了三種方法供我們使用,分別是test()、exec()和compile()。下面具體說一下這三個方法的用處。
1.test()
檢索字符串中指定的值。返回 true 或 false。這個是我們平時最常用的方法。
var reg=/hello \w{3,12}/; alert(reg.test('hello js'));//false alert(reg.test('hello javascript'));//true
2.exec()
檢索字符串中指定的值。匹配成功返回一個數組,匹配失敗返回null。
var reg=/hello/; console.log(reg.exec('hellojs'));//['hello'] console.log(reg.exec('javascript'));//null
3.compile()
compile() 方法用于改變 RegExp。
compile() 既可以改變檢索模式,也可以添加或刪除第二個參數。
var reg=/hello/; console.log(reg.exec('hellojs'));//['hello'] reg.compile('Hello'); console.log(reg.exec('hellojs'));//null reg.compile('Hello','i'); console.log(reg.exec('hellojs'));//['hello']
如何寫一個正則表達式
第一次接觸正則表達式同學們,可能被這個正則表達式的規則弄得迷迷糊糊的,根本無從下手。小編我第一次學這個正則表達式的時候,也是稀里糊涂,什么元字符、量詞完全不知道什么東西,云里霧里的。后面小編細細研究了一下,總結一套方法,希望可以幫助大家。
關于正則表達式書寫規則,可查看 w3school ,上面說的很清楚了,我就不貼出來了。我就闡述一下我寫正則表達式的思路。
其實正則表達式都可以拆成一個或多個(取值范圍+量詞)這樣的組合。針對每個組合我們根據JS正則表達式的規則翻譯一遍,然后將每個組合重新拼接一下就好了。下面我們舉個例子來試一下,看看這個方法行不行。
驗證QQ號的合法性
合法qq號規則:1、5-15位;2、全是數字;3、不以0開頭
第一步:拆成(取值范圍+量詞)這樣的組合
根據QQ號的驗證規則,我們可以拆成兩個(取值范圍+量詞)的組合。分別是:
1.(1~9的數字,1個);2.(0~9的數字,4~14個)
第二步:根據正則表達式規則翻譯(取值范圍+量詞)
1.(1~9的數字,1個) 翻譯成 [1-9]{1}
2.(0~9的數字,4~14個) 翻譯成 [0-9]{4,14}
第三步:將翻譯好的(取值范圍+量詞)組合進行拼接
初學者可能在拼接這一步會犯一個錯誤,可能會組合拼接成這個樣子 /[1-9]{1}[0-9]{4,14}/ 或者簡寫翻譯成 /1-9{4,14}/ 這些都不對的。調用test()方法的時候,你會發現只要一段字符串中有符合正則表達式的字符串片段都會返回true,童鞋們可以試一下。
var reg=/[1-9]{1}[0-9]{4,14}/; alert(reg.test('0589563')); //true,雖然有0,但是'589563'片段符合 alert(reg.test('168876726736788999')); //true,這個字符串長度超出15位,達到18位,但是有符合的字符串片段
正確的寫法應該是這樣的:
/^[1-9][0-9]{4,14}$/(用^和$指定起止位置)
下面我們看一個復雜點的例子:
驗證國內電話號碼
0555-6581752、021-86128488
第一步:拆成(取值范圍+量詞)這樣的組合
這里會拆成兩個大組合:
1、(數字0,1個)+(數字0~9,3個)+(數字1~9,1個)+(數0~9,6個)
2、(數字0,1個)+(數字0~9,2個)+(數字1~9,1個)+(數0~9,7個)
第二步:根據正則表達式規則翻譯(取值范圍+量詞)
1、([0-0],{1})+([0-9],{3})+([1,9],{1})+([0,9],{6})
2、([0-0],{1})+([0-9],{2})+([1,9],{1})+([0,9],{7})
第三步:將翻譯好的(取值范圍+量詞)組合進行拼接
這里我們先拼接一個大組合,然后再將大組合拼接起來
1、0[0-9]{3}-1-9{6}
2、0[0-9]{2}-1-9{7}
最后拼接為:
/(^0[0-9]{3}-[1-9][0-9]{6}$)|(^0[0-9]{2}-[1-9][0-9]{7}$)/
正則表達式拓展
除了RegExp對象提供方法之外,String對象也提供了四個方法來使用正則表達式。
1.match()
在字符串內檢索指定的值,匹配成功返回存放匹配結果的數組,否則返回null。這里需要注意的一點事,如果沒有設置全局匹配g,返回的數組只存第一個成功匹配的值。
var reg1=/javascript/i; var reg2=/javascript/ig; console.log('hello Javascript Javascript Javascript'.match(reg1)); //['Javascript'] console.log('hello Javascript Javascript Javascript'.match(reg2)); //['Javascript','Javascript','Javascript']
2.search()
在字符串內檢索指定的值,匹配成功返回第一個匹配成功的字符串片段開始的位置,否則返回-1。
var reg=/javascript/i; console.log('hello Javascript Javascript Javascript'.search(reg));//6
3.replace()
替換與正則表達式匹配的子串,并返回替換后的字符串。在不設置全局匹配g的時候,只替換第一個匹配成功的字符串片段。
var reg1=/javascript/i; var reg2=/javascript/ig; console.log('hello Javascript Javascript Javascript'.replace(reg1,'js')); //hello js Javascript Javascript console.log('hello Javascript Javascript Javascript'.replace(reg2,'js')); //hello js js js
4.split()
把一個字符串分割成字符串數組。
var reg=/1[2,3]8/; console.log('hello128Javascript138Javascript178Javascript'.split(reg)); //['hello','Javascript','Javascript178Javascript']
結語
正則表達式并不難,懂了其中的套路之后,一切都變得簡單了。在最后我想說點題外話,網上不乏一些文章記錄一些常用的正則表達式,然后新手前端在使用正則表達式的時候都會直接拿來就用。在這里我想說一下自己的看法,這些所謂記錄常用的正則表達式文章并非完全都是正確的,有不少都是錯的。所以同學們在日后使用的過程盡量自己寫正則表達式,實在不會了可以去參考一下,但真的不要照搬下來。咱不說這種會影響自己成長的話,咱就說你抄的一定都是對的嗎?多思考一下,總沒有壞處。
來自:https://segmentfault.com/a/1190000009324194