摘要:說(shuō)到郵箱格式,我們簡(jiǎn)單分析下郵箱的命名方式一般分為三部分郵件地址郵箱域名地址郵件地址部分的規(guī)則如下英文字母數(shù)字下劃線中劃線點(diǎn)舉幾個(gè)栗子根據(jù)以上規(guī)則,我們先寫(xiě)一下郵件地址部分圖示沒(méi)什么問(wèn)題繼續(xù)往下走。
前言
平時(shí)的工作中有很多地方都要用到正則表達(dá)式,不得不說(shuō),正則的表達(dá)式非常強(qiáng)大,比如,我們常用的jquery選擇器,非常方便,jquery的源碼中,選擇器部分應(yīng)用了大量的正則表達(dá)式。然而很多時(shí)候,當(dāng)我們要用到正則的時(shí)候,很多人(也包括我 == ) 的做法都是打開(kāi)百度,復(fù)制粘貼,試一下,沒(méi)問(wèn)題,大功告成。然而,當(dāng)遇到特殊需求的時(shí)候,復(fù)制粘貼大法就不好用了,所以掌握這正則還是很有必要的。下面我就結(jié)合我的一些認(rèn)識(shí)對(duì)正則進(jìn)行簡(jiǎn)單的介紹,如有紕漏歡迎指出。
開(kāi)胃小菜假如有這樣一道題目:
請(qǐng)寫(xiě)一個(gè)郵箱驗(yàn)證的正則。
如果你能寫(xiě)出:
/@/
試一下:
var reg = /@/; reg.test("[email protected]");//true
圖示:
沒(méi)毛??!
恭喜你,你已經(jīng)會(huì)寫(xiě)正則了~ (滑稽臉)
其實(shí)這是阿里的一道技術(shù)面試題,可以寫(xiě)的很簡(jiǎn)單,也可以寫(xiě)的很復(fù)雜,至于寫(xiě)出來(lái)的是什么樣,就要看個(gè)人功力了。
繼續(xù)往下走。說(shuō)到郵箱格式,我們簡(jiǎn)單分析下:
郵箱的命名方式一般分為三部分
郵件地址
@
郵箱域名地址
郵件地址部分的規(guī)則如下:
英文字母
數(shù)字
下劃線
中劃線
點(diǎn)
舉幾個(gè)栗子:
根據(jù)以上規(guī)則,我們先寫(xiě)一下郵件地址部分:
var reg = /^w+([-+_.]w+)*$/; reg.test("123456"); //true reg.test("blue.sky"); //true reg.test("123bird"); //true reg.test("ex-xxx001"); //true
圖示:
沒(méi)什么問(wèn)題, 繼續(xù)往下走。
@ 直接用@匹配就可以了
域名地址部分的規(guī)則:
英文字母
數(shù)字
中劃線
點(diǎn)
@后面的第一個(gè)字符不能是中華線和點(diǎn),簡(jiǎn)單寫(xiě)一下:
var reg= /^@w+([-.]w+)*.w+([-.]w+)*$/ var reg = /^@w+([-.]w+)*.w+([-.]w+)*$/; reg.test("@123-abc.com.cn"); // true
最終的正則可以是這樣子的:
var reg = /^w+([-+_.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/; reg.test("[email protected]"); //true
圖示:
到這里,一種簡(jiǎn)單的郵箱正則就寫(xiě)好了(zz,羅里吧嗦一大堆)。
后面就簡(jiǎn)單的總結(jié)下。
正式入門(mén) 字符類首先介紹下最常見(jiàn)的,也是最基本的 -字符類 。
代碼 | 說(shuō)明 | 其它介紹 | |
---|---|---|---|
. | 匹配除了換行符之外的任何單個(gè)字符 | 舉個(gè)例子,在一條句子中, "nay, an apple is on the tree", .n 可以匹配an, on,但是不能匹配nay ;要注意的是:一個(gè)未被轉(zhuǎn)義的 . 會(huì)匹配除行結(jié)束符意以外的任何字符。 | |
^ | 匹配字符串的開(kāi)始 | ||
$ | 匹配字符串的結(jié)束 | 等同于[0-9]; 一個(gè)未轉(zhuǎn)義的$匹配文本的結(jié)束。當(dāng)指定了m標(biāo)示時(shí),它也能匹配行結(jié)束符。 | |
轉(zhuǎn)義字符 | 可以使用 來(lái)取消某些字符本身的意義,比如要想匹配.,* 可以使用 轉(zhuǎn)義字符。 另外,1 是指向分組1所捕獲的文本的一個(gè)引用,所以它能被再次匹配。 | ||
匹配單詞邊界 | 字符邊界是一個(gè)位置,它的前后都沒(méi)有其他字符,不過(guò)匹配的單詞邊界并不包含在匹配中。換句話說(shuō),匹配字邊界的長(zhǎng)度為零。 | ||
s | 匹配單個(gè)空白字符 | 包括空格、制表符、換行符、換行符。 | |
S | s 的反義,匹配空白以外的單個(gè)字符。 | 、 | |
w | 匹配任何字母數(shù)字字符包括下劃線。 | 等同于[A-Za-z0-9_] | |
W | 匹配任何非字符。 | 等同于[^A-Za-z0-9_] | |
d | 匹配數(shù)字字符 | 等同于[0-9] | |
D | 匹配非數(shù)字字符 | 等同于[^0-9] |
對(duì)照著這個(gè)表格,上面的郵箱正則就很容易看了。
舉幾個(gè)簡(jiǎn)單的例子
console.log(/^w+$/.test("abc")); //true console.log(/^d+$/.test("12345")); //true console.log(/^D+$/.test(" ")); //true標(biāo)示
代碼 | 含義 | 用法 |
---|---|---|
g | global, 全局的 | 如果標(biāo)示 g 被使用,值為true |
i | ignore, 大小寫(xiě)不敏感 | 如果標(biāo)示 i 被使用,值為true |
m | multiLine, 多行查找( ^ 和 $能匹配行結(jié)束符 ) | 如果標(biāo)示 m 被使用,值為true |
一般用來(lái)指定數(shù)量,常用的如下所示:
代碼 | 說(shuō)明 | |
---|---|---|
重復(fù)零次或更多次 | ||
+ | 重復(fù)1次或更多次 | |
? | 重復(fù)0次或更多次 | |
{n} | 重復(fù)n次 | |
{n,} | 重復(fù)大于等于n次 | |
{n,m} | 重復(fù)n到m次 |
舉幾個(gè)簡(jiǎn)單的例子
console.log(/^w{3}$/.test("abc")); //true console.log(/^d{1,5}$/.test("12345")); //true分支條件
正則表達(dá)式里的分枝條件指的是有幾種規(guī)則,如果滿足其中任意一種規(guī)則都應(yīng)該當(dāng)成匹配。
具體方法是用|把不同的規(guī)則分隔開(kāi)。
我們來(lái)看看個(gè)具體的例子:
var reg = /0d{2}-d{8}|0d{3}-d{7}/;
這個(gè)表達(dá)式能匹配兩種以連字號(hào)分隔的電話號(hào)碼:
一種是3位區(qū)號(hào),8位本地號(hào)(如010-12345678),
一種是4位區(qū)號(hào),7位本地號(hào)(0755-1234567)。
或者寫(xiě)一個(gè)簡(jiǎn)單的匹配手機(jī)號(hào)碼的正則:
var reg = /^1(3|4|5|7|8)[0-9]d{8}$/;分組
我們已經(jīng)知道了如何重復(fù)單個(gè)字符,但如果想要重復(fù)多個(gè)字符又該怎么辦呢?
這時(shí)候就可以使用分組了。
分組的類型有四種:
代碼 | 用法 | 介紹 | |
---|---|---|---|
捕獲型 | () | 一個(gè)捕獲刑分組是一個(gè)被包圍在圓括號(hào)里的正則表達(dá)式分支,任何匹配這個(gè)分組的字符都會(huì)被捕獲。每個(gè)捕獲型分組都被指定了一個(gè)數(shù)字。在正則表達(dá)式中第一個(gè)捕獲的(是分組1,第二個(gè)捕獲(的是是分組2。 | |
非捕獲型 | (?:前綴) | 非捕獲型分組僅做簡(jiǎn)單的匹配,并不會(huì)捕獲匹配的文本。 | |
向前正向匹配 | (?=前綴) | 向前正向匹配類似于非捕獲型分組,但在這個(gè)組匹配之后,文本會(huì)倒回到它開(kāi)始的地方,實(shí)際上并不匹配任何東西。 | |
向前負(fù)向匹配 | (?!前綴) | 向前負(fù)向匹配類似于向前正向匹配分組,但只有當(dāng)它匹配失敗的時(shí)候才繼續(xù)向前進(jìn)行匹配。 |
舉個(gè)簡(jiǎn)單的例子:
實(shí)現(xiàn)一個(gè)驗(yàn)證ip地址的正則:
var reg = /^((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)$/; reg.test("127.0.0.1"); // true reg.test("255.255.888.888"); // false
結(jié)合圖示:
集合圖示就很清晰了。
上面的部分只是正則表達(dá)式很小的一部分,篇幅有限,下一篇再做介紹。
那根據(jù)上面出現(xiàn)的內(nèi)容,我們看一個(gè)更復(fù)雜的例子來(lái)鞏固,摘自精粹,一起來(lái)看下。
var parse_url = /^(?:([A-Za-z]+):)?(/{0,3})([0-9.-A-Za-z]+)(?::(d+))?(?:/([^?#]*))?(?:?([^#]*))?(?:#(.*))?$/; var result = parse_url.exec(url); names.forEach(function(item, index){ console.log(item + ": " + result[index]); }); console.log(result); // url: http://www.ora.com:80/goodparts?q#fragement // scheme: http // slash: // // host: www.ora.com // port: 80 // path: goodparts // query: q // hash: fragement
是不是感覺(jué)萌萌噠(滑稽臉.jpg)
看看圖:
我們來(lái)分解下parse_url,看它到底是怎么工作的。
首先是 ^, 表示字符串的開(kāi)始。它是一個(gè)錨,指引exec不要跳過(guò)那些不像url的前綴,只匹配那些從開(kāi)頭就像url一樣的字符串。
schemevar reg = (?:([A-Za-z]+):)
這個(gè)因子匹配一個(gè)協(xié)議名,當(dāng)且僅當(dāng)后面跟隨一個(gè):的時(shí)候才匹配。
(?...) 表示一個(gè)非捕獲型分組。
后綴? 表示這個(gè)分組是可選的。
第一個(gè)捕獲型分組的編號(hào)是1,所以該匹配的結(jié)果會(huì)出現(xiàn)在result[1]中。
slashvar reg = (/{0,3});
下一個(gè)因子是捕獲刑分組2,這里需要對(duì) / 進(jìn)行轉(zhuǎn)義,這樣就不會(huì)被解釋為結(jié)束符。
{0,3}表示 斜杠 / 會(huì)被匹配 0次 或者1~3次。
var reg = ([0-9.-A-Za-z]+);
這第三個(gè)捕獲型分組是是主機(jī)名. 由 一個(gè)或多個(gè)數(shù)字,字母, ., - 組成.
這里需要對(duì)-進(jìn)行轉(zhuǎn)義。
var reg = (::(d+))?;
這第四個(gè)捕獲型分組是端口號(hào)。它是由一個(gè)前置:加上一個(gè)或多個(gè)數(shù)字而組成的序列。
pathvar reg = (?:/([^?#]*))?;
這個(gè)是另一個(gè)可選的分組,以一個(gè)/`開(kāi)始。之后的字符類[^?#] 以一個(gè)^ 開(kāi)始,表示這個(gè)類包含除? # 之外的所有字符。*表示匹配0次 或多次。
queryvar reg = (?:?([^#]*))?;
這個(gè)還是一個(gè)可選分組,以一個(gè)?`開(kāi)始,它包含了一個(gè)捕獲型分組,這個(gè)分組包含 0個(gè) 或多個(gè) 非 #的字符。
hashvar reg = (?:#(.*))?;
這是最后一個(gè)可選分組,以一個(gè)#`開(kāi)始, . 會(huì)匹配除換行符以外的所有字符。
最后的$表示字符串的結(jié)束,它保證這個(gè)url的尾部沒(méi)有其他更多內(nèi)容了。
以上便是parse_url的所有因子了。
這個(gè)正則表達(dá)式還可以寫(xiě)的更復(fù)雜,但通常不推薦這么做。
再舉個(gè)例子:
var url = "http://www.ora.com:80/goodparts?q#fragement"; var result = url.split(/^(([^:/?#]+):)?((//)?([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?/); console.log(result);
短小精悍的正則表達(dá)式是最好的。
作為基礎(chǔ)入門(mén)的介紹,寫(xiě)到這里就差不多了,后續(xù)內(nèi)容后續(xù)會(huì)繼續(xù)發(fā)布。
本大汪差不多也該收拾東西,明天回家~預(yù)祝大家?年大吉。
附文中出現(xiàn)的可視化工具
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/81367.html
摘要:特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 本以為自己收藏的站點(diǎn)多,可以很快搞定,沒(méi)想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補(bǔ)充。有錯(cuò)誤的地方,還請(qǐng)斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應(yīng)和斧正,會(huì)及時(shí)更新,平時(shí)業(yè)務(wù)工作時(shí)也會(huì)不定期更...
摘要:寫(xiě)一個(gè)正則表達(dá)式來(lái)測(cè)試變量中是否包含字符串。用函數(shù)給出不使用字符,但和等價(jià)的正則表達(dá)式。第十四課標(biāo)志全局匹配標(biāo)志第二個(gè)常用的標(biāo)志是全局匹配標(biāo)志,用字母表示。寫(xiě)出一個(gè)正則表達(dá)式來(lái)檢驗(yàn)合法性。非捕獲組的主要用途是給一個(gè)組賦予量詞。 TRY REGEX 是一個(gè)交互式的正則表達(dá)式學(xué)習(xí)項(xiàng)目項(xiàng)目地址:https://github.com/callumacra...在線地址:http://tryre...
摘要:一前言正則表達(dá)式入門(mén)實(shí)踐系列文章適合熟悉至少使用過(guò)正則表達(dá)式的同學(xué),在文章開(kāi)始的時(shí)候我們都會(huì)帶著問(wèn)題去思考如何正確應(yīng)用正則表達(dá)式解決出現(xiàn)的問(wèn)題,在解決問(wèn)題的過(guò)程中增長(zhǎng)你的知識(shí),提高你的實(shí)踐能力。 一 前言 正則表達(dá)式入門(mén)實(shí)踐系列文章適合熟悉至少使用過(guò)正則表達(dá)式的同學(xué),在文章開(kāi)始的時(shí)候我們都會(huì)帶著問(wèn)題去思考如何正確應(yīng)用正則表達(dá)式解決出現(xiàn)的問(wèn)題,在解決問(wèn)題的過(guò)程中增長(zhǎng)你的知識(shí),提高你的實(shí)踐...
摘要:解決模型退化問(wèn)題避免了過(guò)渡訓(xùn)練后,導(dǎo)致模型準(zhǔn)確率反而降低的情況。經(jīng)過(guò)實(shí)驗(yàn)后發(fā)現(xiàn)確實(shí)能解決這個(gè)問(wèn)題。本人對(duì)于這個(gè)問(wèn)題的確切原因并不清楚,但是猜測(cè)這個(gè)原因很可能是由于梯度消失以及眾多其他原因所造成的。 給定卷積神經(jīng)網(wǎng)絡(luò)輸入,卷積核大小,padding,步長(zhǎng),求輸出的shape?showImg(https://segmentfault.com/img/remote/146000001781...
閱讀 3609·2023-04-26 02:55
閱讀 2878·2021-11-02 14:38
閱讀 4151·2021-10-21 09:39
閱讀 2861·2021-09-27 13:36
閱讀 3976·2021-09-22 15:08
閱讀 2662·2021-09-08 10:42
閱讀 2814·2019-08-29 12:21
閱讀 685·2019-08-29 11:22