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