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

來源:互聯網
上載者:User

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


情境1:驗證email是否合法

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

hyy@gmail.com Google郵箱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郵箱

1、分析規則

xxx首碼:可以是數字、字母、-的組合@:這個單字元匹配即可尾碼:英文或者數字.:點分隔字元結尾:com或者cn

2、從第一個規則開始匹配

首碼可以是數字、字母、-的組合,-的特點是只能寫在數字或者字母中間,不能放在收尾兩邊。

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

匹配結果,加粗部分

hyy@gmail.com Google郵箱

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+@

匹配結果,加粗部分

hyy@gmail.com Google郵箱

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、後面的規則就很簡單了

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

查看匹配結果

情境2:驗證時間格式

時間格式有很多,如果要寫一個大正則來匹配所有,挺難,下面我們只匹配xxxx-xx-xx。

2017-09-15

1、分析規則

這裡分為幾個點,年、月、日

年:4位元字,1或2開頭

月:2位元字,0或1開頭

日:1位元字的時候是1-9,2位元字的時候,第一位是0-3,第二位是0-9

2、匹配年

日期正則是最難寫的之一,要寫得很精確,非常難。

第一位元字1或者2,使用(1|2){1},2-4位是0-9,寫成[0-9]{3},組合起來就是年

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

3、匹配月

年和月之間的串連符寫成-

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

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

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

4、匹配日

日期第一位是0的時候,第二位是0-9,第一位是1的時候,第二位是0-9,第一位是2的時候,第二位是0-9,第一位是3的時候,第二位是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、日期格式類型很多,你應該按照你工作需要去寫規則,這裡我列舉這麼多是為了練習多種規則的組合寫法。

情境3:驗證URL是否合法

url正則也是一個複雜的情境,我找了幾個不一樣的url來測試

https://segmentfault.com/writehttps://shimo.im/doc/ME90WXr4Hm8nx3Jl?r=PPGD2Dhttps://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching_FAQhttps://regex101.com/http://www.baidu.com/#/abouthttp://www.baidu.com

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

/https?:///g

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

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

到了後面,規則變的非常複雜,我也不是非常瞭解url網域名稱之後的所有寫法,就從我一開始寫的測試集來看,可以寫成下面的形式

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

這個正則雖然匹配出來了所以測試範例,但是他是有缺陷的,我在網上也看了其他的一些寫法,測試之後都有問題,如何寫出一個精確度非常高的url正則,還需要你的努力。

情境4:擷取url的參數

網上的正則是使用window.location.search來擷取問號後面的參數字元,我使用了一種純正則實現的新方法。url可傳可不傳。

function getUrlParamName(name, url) { if (typeof name !== 'string') throw Error('必須是字串') if (!url) { //如果沒有傳url,則讀取當前網站的url url = window.location.href } //匹配出name=value的數組 let arr = url.match(/(?!(?:(?|&)))(w+)=(w+)/g); for(let v of arr){ //如果某個元素和傳入參數組成的字串剛好匹配,則返回該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

方法你可以花時間慢慢研究,我在這裡教你一個新知識,叫做零寬斷言。

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

這裡用到的文法如下:分為左右2個括弧,左邊的(?!(?:(?|&)))表示匹配到?或者&,但是不擷取這2個符號,而是擷取跟著它後面匹配的正則。

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

零寬斷言這一塊我還沒有完成掌握,它的大概意思是,擷取某個字元或者某些字元前面的正則或者後面的正則。並不高大上,估計是某人翻譯的時候,取了個裝逼的名字吧。

總結

本章分享了4個情境的實踐,我本人不是正則大神,也是剛剛開始研究正則,發現學習正則,最重要的一點是要知道當前需求的規則,“無規則無正則”,正則還有很多符號需要記住,下一步再多練一些正則題目,然後再看看基礎文檔鞏固一下知識。

好的正則大神可以寫出效能非常好的運算式,正則和js一樣,不同的寫法也會有效能的差距。資料量小的時候可以忽略,當長文本分析時,就需要你成為一個優秀的正則大神了。


作者:二月

原文:https://segmentfault.com/a/1190000011194709

聲明:文章著作權歸作者所有,如有侵權,請聯絡小編刪除。


感謝  ·  轉寄歡迎大家留言




  • 本文已收錄於以下專欄:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.