成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

正則系列——正則虐我千百遍,我要反抗了

lk20150415 / 2414人閱讀

摘要:正則正則匹配的是零寬斷言這一塊我還沒(méi)有完成掌握,它的大概意思是,獲取某個(gè)字符或者某些字符前面的正則或者后面的正則。下一章正則表達(dá)式理論鞏固篇正則系列文章整理到了

如果你正則基礎(chǔ)為0,請(qǐng)先看第一篇文章:JavaScript正則表達(dá)式入門心得

實(shí)戰(zhàn)篇

上一章我分享了正則入門的一些體會(huì)以及注意事項(xiàng)。這一章開(kāi)始挑一些常用的比較復(fù)雜一點(diǎn)的需求來(lái)練習(xí)一下。

場(chǎng)景1:驗(yàn)證email是否合法

郵箱種類太多太多,什么net后綴,特殊的我們不做處理,下面我找了常用的一些郵箱:

[email protected]  谷歌郵箱
[email protected]  qq郵箱
[email protected]  163郵箱
[email protected]  新浪郵箱
[email protected]  搜狐郵箱
[email protected]  hotmai郵箱
[email protected]  189郵箱
[email protected]  139郵箱

1、分析規(guī)則

xxx前綴:可以是數(shù)字、字母、-的組合
@:這個(gè)單字符匹配即可
后綴:英文或者數(shù)字
.:點(diǎn)分隔符
結(jié)尾:com或者cn

2、從第一個(gè)規(guī)則開(kāi)始匹配
前綴可以是數(shù)字、字母、-的組合,-的特點(diǎn)是只能寫在數(shù)字或者字母中間,不能放在收尾兩邊。

w+-?w+ //表示數(shù)字或者字母,中間可以插入-。

匹配結(jié)果,加粗部分
hyy@gmail.com 谷歌郵箱
hyy12@qq.com qq郵箱
hyy-123@163.com 163郵箱
732662@sina.com 新浪郵箱
hyy@sohu.com 搜狐郵箱
hyy@hotmail.com hotmai郵箱
hyy@189.cn 189郵箱
hyy@139.com 139郵箱

3、匹配@字符

w+-?w+@ 

匹配結(jié)果,加粗部分
hyy@gmail.com 谷歌郵箱
hyy12@qq.com qq郵箱
hyy-123@163.com 163郵箱
732662@sina.com 新浪郵箱
hyy@sohu.com 搜狐郵箱
hyy@hotmail.com hotmai郵箱
hyy@189.cn 189郵箱
hyy@139.com 139郵箱

4、后面的規(guī)則就很簡(jiǎn)單了

/w+-?w+@w+.(com|cn)/g

查看匹配結(jié)果

場(chǎng)景2:驗(yàn)證時(shí)間格式

時(shí)間格式有很多,如果要寫一個(gè)大正則來(lái)匹配所有,挺難,下面我們只匹配xxxx-xx-xx。

2017-09-15

1、分析規(guī)則
這里分為幾個(gè)點(diǎn),年、月、日
年:4位數(shù)字,1或2開(kāi)頭
月:2位數(shù)字,0或1開(kāi)頭
日:1位數(shù)字的時(shí)候是1-9,2位數(shù)字的時(shí)候,第一位是0-3,第二位是0-9

2、匹配年
日期正則是最難寫的之一,要寫得很精確,非常難。
第一位數(shù)字1或者2,使用(1|2){1},2-4位是0-9,寫成[0-9]{3},組合起來(lái)就是年

/(1|2){1}[0-9]{3}/g

3、匹配月
年和月之間的連接符寫成-

/(1|2){1}[0-9]{3}-/g

月的組成分為0開(kāi)頭和1開(kāi)頭2種情況,如果是0開(kāi)頭,第一位的0也可以不存在,第二位是0-9。如果是1開(kāi)頭,第二位是0-2,組合起來(lái)就是(0?[1-9]|1[0-2])

/(1|2){1}[0-9]{3}-(0?[1-9]|1[0-2])/g

4、匹配日
日期第一位是0的時(shí)候,第二位是0-9,第一位是1的時(shí)候,第二位是0-9,第一位是2的時(shí)候,第二位是0-9,第一位是3的時(shí)候,第二位是0-1,則(0[1-9]|1[0-9]|2[0-9]|3[0-1])

/(1|2){1}[0-9]{3}-(0?[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[0-1])/g

5、日期格式類型很多,你應(yīng)該按照你工作需要去寫規(guī)則,這里我列舉這么多是為了練習(xí)多種規(guī)則的組合寫法。

場(chǎng)景3:驗(yàn)證URL是否合法

url正則也是一個(gè)復(fù)雜的場(chǎng)景,我找了幾個(gè)不一樣的url來(lái)測(cè)試

https://segmentfault.com/write
https://shimo.im/doc/ME90WXr4Hm8nx3Jl?r=PPGD2D
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching_FAQ
https://regex101.com/
http://www.baidu.com/#/about
http://www.baidu.com

這次我們省略步驟,直接分析,先是開(kāi)頭,2種寫法,http://和https://

/https?:///g

接著看域名,可能是xx.com,也可能是yy.xx.com

/https?://w+.w+(.w+)?/?/g

到了后面,規(guī)則變的非常復(fù)雜,我也不是非常了解url域名之后的所有寫法,就從我一開(kāi)始寫的測(cè)試集來(lái)看,可以寫成下面的形式

/https?://w+.w+(.w+)?/?([w-_#/?=.]+)?/g

這個(gè)正則雖然匹配出來(lái)了所以測(cè)試樣例,但是他是有缺陷的,我在網(wǎng)上也看了其他的一些寫法,測(cè)試之后都有問(wèn)題,如何寫出一個(gè)精確度非常高的url正則,還需要你的努力。

場(chǎng)景4:獲取url的參數(shù)

網(wǎng)上的正則是使用window.location.search來(lái)獲取問(wèn)號(hào)后面的參數(shù)字符,我使用了一種純正則實(shí)現(xiàn)的新方法。url可傳可不傳。

function getUrlParamName(name, url) {
  if (typeof name !== "string") throw Error("必須是字符串")
  if (!url) {
    //如果沒(méi)有傳url,則讀取當(dāng)前網(wǎng)站的url
    url = window.location.href
  }
  //匹配出name=value的數(shù)組
  let arr = url.match(/(?!(?:(?|&)))(w+)=(w+)/g);
  for(let v of arr){
    //如果某個(gè)元素和傳入?yún)?shù)組成的字符串剛好匹配,則返回該value。
    if(new RegExp(name + "=([0-9a-zA-Z]+)", "g").test(v)) {
      return v.match(new RegExp(name + "=([0-9a-zA-Z]+)", "i"))[1]
    } 
  }
  return null
}
let t = getUrlParamName("r")
console.log(t) // PPGD2D

方法你可以花時(shí)間慢慢研究,我在這里教你一個(gè)新知識(shí),叫做零寬斷言。

(?!(?:(?|&)))(w+)=(w+)

這里用到的語(yǔ)法如下:分為左右2個(gè)括號(hào),左邊的(?!(?:(?|&)))表示匹配到?或者&,但是不獲取這2個(gè)符號(hào),而是獲取跟著它后面匹配的正則。

s = "?r=abc&qId=123"
(?!(正則))(正則) // 匹配的是r=abc , qId=123

零寬斷言這一塊我還沒(méi)有完成掌握,它的大概意思是,獲取某個(gè)字符或者某些字符前面的正則或者后面的正則。并不高大上,估計(jì)是某人翻譯的時(shí)候,取了個(gè)裝逼的名字吧。

總結(jié)

本章分享了4個(gè)場(chǎng)景的實(shí)踐,我本人不是正則大神,也是剛剛開(kāi)始研究正則,發(fā)現(xiàn)學(xué)習(xí)正則,最重要的一點(diǎn)是要知道當(dāng)前需求的規(guī)則,“無(wú)規(guī)則無(wú)正則”,正則還有很多符號(hào)需要記住,下一步再多練一些正則題目,然后再看看基礎(chǔ)文檔鞏固一下知識(shí)。
好的正則大神可以寫出性能非常好的表達(dá)式,正則和js一樣,不同的寫法也會(huì)有性能的差距。數(shù)據(jù)量小的時(shí)候可以忽略,當(dāng)長(zhǎng)文本分析時(shí),就需要你成為一個(gè)優(yōu)秀的正則大神了。

下一章:正則表達(dá)式理論鞏固篇

正則系列文章整理到了github:https://github.com/hyy1115/Re...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91840.html

相關(guān)文章

  • Java - 開(kāi)發(fā)項(xiàng)目簡(jiǎn)單感想

    摘要:目前實(shí)現(xiàn)的本地對(duì)戰(zhàn)。盲目樂(lè)觀不得不承認(rèn),開(kāi)發(fā)這個(gè)項(xiàng)目的時(shí)候我顯得過(guò)去樂(lè)觀了。此處分割線后記開(kāi)學(xué)新學(xué)期加了軟件體系結(jié)構(gòu),數(shù)值分析,軟件項(xiàng)目管理等課程。此外,編程的幾點(diǎn)注意事項(xiàng)也是沒(méi)有達(dá)到。 想了想,光在這里說(shuō)不給源代碼也是很操蛋的。@影耳 開(kāi)源在這里 http://git.oschina.net/svtter/DaVinci 希望大家能夠一起完成這個(gè)項(xiàng)目,也希望大家能夠多多指出我的各種不...

    AWang 評(píng)論0 收藏0
  • 一窺國(guó)足輸韓國(guó)之后人們的評(píng)論,我爬懂球帝APP

    摘要:如果你是個(gè)足球迷的話,估計(jì)或多或少都會(huì)看一下昨晚中國(guó)踢韓國(guó)的比賽,因?yàn)椴还芩麄兲叩迷鯓樱覀冞€是深愛(ài)著他們,那句話說(shuō)得好,國(guó)足虐我千百遍,我待國(guó)足如初戀。 如果你是個(gè)足球迷的話,估計(jì)或多或少都會(huì)看一下昨晚中國(guó)踢韓國(guó)的比賽,因?yàn)椴还芩麄兲叩迷鯓?,我們還是深愛(ài)著他們,那句話說(shuō)得好,國(guó)足虐我千百遍,我待國(guó)足如初戀。更何況他們兩場(chǎng)都踢贏了,所以面對(duì)第三場(chǎng)實(shí)力有點(diǎn)強(qiáng)的韓國(guó)隊(duì)也是希望能贏的,畢竟我...

    Ververica 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<