在《正則表達(dá)式——入門》中我們從WHAT澎粟、WHY、HOW三個方面簡單介紹了正則技術(shù),如果你對正則感興趣柔逼,筆者希望帶領(lǐng)大家更進(jìn)一步學(xué)習(xí)正則表達(dá)式。
常見案例解析
案例一:驗證郵箱的有效性
/^[a-z0-9_.]+@([a-z0-9\-]+\.)+[a-z]{2,4}$/i
- ^ :匹配字符串的開始位置
- [a-z0-9_.]+ :可以是以下字符割岛,字母愉适、數(shù)字、下劃線癣漆、英文點维咸,且至少出現(xiàn)1次
- @ :匹配一個@字符
- [a-z0-9-]+ :可以是以下字符,字母扑媚、數(shù)字腰湾、短橫線,且至少出現(xiàn)1次
- ([a-z0-9-]+.)+ :出現(xiàn)多個字母疆股、數(shù)字费坊、短橫線后跟隨一個英文點,合起來出現(xiàn)1+次
- [a-z]{2,4} :匹配2到4個字母
- $ :匹配字符串的結(jié)束
測試:
var reg = /^[a-z0-9_.]+@([a-z0-9\-]+\.)+[a-z]{2,4}$/i;
var isok = reg.test('test_1@csdn.net');
console.log(isok); //true
isok = reg.test('test_1@blog.csdn.net');
console.log(isok); //true
isok = reg.test('test_1+a@csdn.net');
console.log(isok); //false
案例二:驗證URL的有效性
/^https?:\/\/([a-z0-9\-]+\.)+[a-z]{2,4}(\/\S*)?$/i
- ^ :匹配字符串的開始位置
- https? :匹配具體字符https旬痹,其中s可以不出現(xiàn)
- :// :匹配字符://
- [a-z0-9-]+ :可以是以下字符附井,字母、數(shù)字两残、短橫線永毅,且至少出現(xiàn)1次
- ([a-z0-9-]+.)+ :出現(xiàn)多個字母、數(shù)字人弓、短橫線后跟隨一個英文點沼死,合起來出現(xiàn)1+次
- [a-z]{2,4} :匹配2到4個字母
- (/\S*)? :匹配/和N個非空格字符,N大于等于0崔赌,這個組合可以出現(xiàn)意蛀,也可以不出現(xiàn)
- $ :匹配字符串的結(jié)束
測試:
var reg = /^https?:\/\/([a-z0-9\-]+\.)+[a-z]{2,4}(\/\S*)?$/i;
var isok = reg.test('http://blog.csdn.net/kla.dd');
console.log(isok); //true
isok = reg.test('https://blog.csdn.net/master/profile?show=%99');
console.log(isok); //true
isok = reg.test('htt://csdn.netdd');
console.log(isok); //false
案例三:驗證一個字符串中是否包含關(guān)鍵詞“世界末日”或“fuck”
/(世.{0,3}界.{0,3}末.{0,3}日)|(f[^a-z]{0,3}u[^a-z]{0,3}c[^a-z]{0,3}k)/i
- (世.{0,3}界.{0,3}末.{0,3}日) :世界末日中間可以出現(xiàn)任意3個以內(nèi)的字符
- | :或的意思
- (f[a-z]{0,3}u[a-z]{0,3}c[^a-z]{0,3}k) :fuck中間可以出現(xiàn)3個以內(nèi)非字母的字符
測試:
var reg = /(世.{0,3}界.{0,3}末.{0,3}日)|(f[^a-z]{0,3}u[^a-z]{0,3}c[^a-z]{0,3}k)/i;
var isok = reg.test('世-界-末日');
console.log(isok); //true
isok = reg.test('f.uck');
console.log(isok); //true
isok = reg.test('fxuck');
console.log(isok); //false
案例四:去掉內(nèi)容中所有的html標(biāo)簽
/<\/?[a-z0-9]{1,10}(\s.*?)?>/ig
- < :匹配左尖括號本身
- /? :可以出現(xiàn)一個斜線,也可以不出現(xiàn)
- [a-z]{1,10} :出現(xiàn)1到10個字母和數(shù)字
- (\s.*?)? :空格后跟隨任意字符健芭,這個組合也可以不出現(xiàn)
:匹配右尖括號本身
- ig :i表示忽略大小寫县钥,g表示全局匹配,就是找到所有符合規(guī)則的內(nèi)容慈迈,不加g只匹配第一個符合規(guī)則的內(nèi)容
測試:
var reg = /<\/?[a-z]{1,10}(\s.*?)?>/ig;
var str = '<h1>title</h1> is very <a href="#big">big</a>';
str = str.replace(reg, '');
console.log(str); //title is very big
通過對以上幾個正則表達(dá)式的分析若贮,相信你應(yīng)該對正則有了個較深的認(rèn)識,下邊我們就來系統(tǒng)的學(xué)習(xí)一下正則表達(dá)式。
字符組[]
<b style="color:green">[abcd1234@#$%]</b> 表示可以出現(xiàn)括號內(nèi)的任意字符谴麦。
如果以“^”開頭蠢沿,表示可以出現(xiàn)除括號內(nèi)的字符以外的任意字符。
如细移,<b style="color:green">[^abc]</b>表示匹配除“abc”以外的任意字符搏予。
在字符組內(nèi)有一個特殊的字符,短橫線“-”弧轧。連字符表示從一個字符的到另外一個字符的范圍雪侥,注意后邊的字符碼要大于前邊的字符碼。
如精绎,<b style="color:green">[0-9]</b>表示匹配從0到9的任意字符(0123456789)速缨;<b style="color:green">[a-f]</b>表示匹配從a到f的任意字符(abcdef)。
如果需要匹配“^”或“-”字符本身代乃,則需要用“\”來轉(zhuǎn)義:<b style="color:green">[^-]</b>
最后需要注意的是旬牲,字符組[]只匹配一個字符,所以它經(jīng)常跟元字符“+”或“{m,n}”一起使用搁吓。
如:<b style="color:green">[0-9]{1,5}</b>表示連續(xù)出現(xiàn)1到5個數(shù)字原茅。
捕獲組()
捕獲組的作用就是把一個子正則表達(dá)式匹配到的內(nèi)容按照一定編號保存到內(nèi)存中,以備后續(xù)獲取這些內(nèi)容堕仔。
捕獲組有兩種形式:普通捕獲組(expression) 和 命名捕獲組(?<name>expression)
需要注意的是擂橘,目前Javascript并不支持命名捕獲組。
var result = '999ab'.match(/\d+([a-z]+)/);
console.log(result[0]);//999ab 存儲全部匹配到的內(nèi)容
console.log(result[1]);//ab 存儲第1個捕獲組中的內(nèi)容
var newStr = '999ab'.replace(/\d+([a-z]+)/,'數(shù)字后的單詞是:$1');
console.log(newStr);//數(shù)字后的單詞是:ab
在C#中支持命名捕獲組摩骨,獲取命名組的方式跟普通方式一樣通贞,只是把數(shù)字改成組名就行了。
單詞邊界\b
元字符\b表示一個單詞的邊界恼五。單詞邊界主要應(yīng)用于英文單詞的匹配昌罩。
比如要從源字符串中獲取單詞body的個數(shù)
var s = 'the body is: hello eveybody, my body is here';
var len = s.match(/\bbody\b/g).length;
console.log(len);//2
如果不加單詞邊界的話,就會輸出3
貪婪模式和非貪婪模式
貪婪模式灾馒,盡可能多的匹配內(nèi)容茎用;非貪婪模式正好相反,盡可能少的匹配內(nèi)容睬罗。當(dāng)然轨功,他們都有一個大的前提,就是符合正則規(guī)則的前提下傅物。
屬于貪婪模式的量詞夯辖,也叫做匹配優(yōu)先量詞琉预,包括:
“{m,n}”董饰、“{m,}”、“?”、“”和“+”卒暂。
一般來說啄栓,在普通量詞后加上問號,即構(gòu)成了非貪婪模式也祠,如:
“{m,n}?”昙楚、“{m,}?”、“??”诈嘿、“?”和“+?”
舉例堪旧,要匹配以數(shù)字結(jié)束的子字符串
var result = 'a1b2c3'.match(/.+\d/);
console.log(result[0]);//a1b2c3
貪婪模式下,.+會盡可能多的“拿”字符
var result = 'a1b2c3'.match(/.+?\d/);
console.log(result[0]);//a1
非貪婪模式下奖亚,.+?會盡可能少的“拿”字符淳梦,當(dāng)匹配到1的時候已經(jīng)能夠滿足規(guī)則,匹配停止昔字。
作者:朱會震