摘要:正則正則匹配的是零寬斷言這一塊我還沒有完成掌握,它的大概意思是,獲取某個字符或者某些字符前面的正則或者后面的正則。下一章正則表達式理論鞏固篇正則系列文章整理到了
如果你正則基礎為0,請先看第一篇文章:JavaScript正則表達式入門心得
實戰篇上一章我分享了正則入門的一些體會以及注意事項。這一章開始挑一些常用的比較復雜一點的需求來練習一下。
場景1:驗證email是否合法郵箱種類太多太多,什么net后綴,特殊的我們不做處理,下面我找了常用的一些郵箱:
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郵箱
1、分析規則
xxx前綴:可以是數字、字母、-的組合 @:這個單字符匹配即可 后綴:英文或者數字 .:點分隔符 結尾:com或者cn
2、從第一個規則開始匹配
前綴可以是數字、字母、-的組合,-的特點是只能寫在數字或者字母中間,不能放在收尾兩邊。
w+-?w+ //表示數字或者字母,中間可以插入-。
匹配結果,加粗部分
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+@
匹配結果,加粗部分
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、后面的規則就很簡單了
/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/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
這次我們省略步驟,直接分析,先是開頭,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一樣,不同的寫法也會有性能的差距。數據量小的時候可以忽略,當長文本分析時,就需要你成為一個優秀的正則大神了。
下一章:正則表達式理論鞏固篇
正則系列文章整理到了github:https://github.com/hyy1115/Re...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/91840.html
摘要:目前實現的本地對戰。盲目樂觀不得不承認,開發這個項目的時候我顯得過去樂觀了。此處分割線后記開學新學期加了軟件體系結構,數值分析,軟件項目管理等課程。此外,編程的幾點注意事項也是沒有達到。 想了想,光在這里說不給源代碼也是很操蛋的。@影耳 開源在這里 http://git.oschina.net/svtter/DaVinci 希望大家能夠一起完成這個項目,也希望大家能夠多多指出我的各種不...
摘要:如果你是個足球迷的話,估計或多或少都會看一下昨晚中國踢韓國的比賽,因為不管他們踢得怎樣,我們還是深愛著他們,那句話說得好,國足虐我千百遍,我待國足如初戀。 如果你是個足球迷的話,估計或多或少都會看一下昨晚中國踢韓國的比賽,因為不管他們踢得怎樣,我們還是深愛著他們,那句話說得好,國足虐我千百遍,我待國足如初戀。更何況他們兩場都踢贏了,所以面對第三場實力有點強的韓國隊也是希望能贏的,畢竟我...
閱讀 1271·2021-11-15 18:14
閱讀 3127·2021-08-25 09:38
閱讀 2663·2019-08-30 10:55
閱讀 2673·2019-08-29 16:39
閱讀 1305·2019-08-29 15:07
閱讀 2446·2019-08-29 14:14
閱讀 810·2019-08-29 12:36
閱讀 909·2019-08-29 11:21