手把手分析一個郵箱正則表達式

手把手分析一個郵箱正則表達式

正則這東西在不少人看來就是要背的記的東西不少,一串長的正則表達式看起來像看天書同樣的。javascript

好比這樣的 :)java

/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/

其實總的來講正則其實也沒那麼複雜,多是你用的頻率比較低加上短時間記憶把這個東西從意識上覆雜化了。正則表達式

在進入正題以前咱們先作一個正則基礎知識快速掃盲。code

一個完整的正則表達式的組成有幾大要素:

  1. 基本結構 / / (兩個左斜槓,中間寫表達式)
  2. 匹配模式 / /g,m,u,s,i (匹配模式是寫在右邊左斜槓的後面,好比經常使用的g,表明的是全局匹配,其餘的不贅述)
  3. 類,這個表明你想要匹配什麼樣的字符串或數字或者符號,好比/[0-9]/g(全局條件下有一個數字就算匹配成功),中間的[0-9]就表明你要匹配的字符串,也就是類。除了[0-9],還有[a-z]、s、S、d、D等等
  4. 量詞,用花括號{}表示,支持一位或者兩位({n}、{n,}、{n, m})這幾種寫法都是能夠的,若是隻有一個n表明匹配幾回,若是n逗號表明至少匹配n次,n,m表明匹配最少n次最多匹配m次。
'231erwefsdf'.replace(/[0-9]{2,4}/g, 'q')
  // "qerwefsdf"
  1. 邊界, ^從最開始匹配,$從結尾匹配。b匹配一個單詞邊界,也就是指單詞和空格間的位置,如 erb能夠匹配"hover" 中的 'er',但不能匹配 "verb" 中的 'er' B匹配非單詞邊界。如 erB能匹配 "verb" 中的 'er',但不能匹配 "hover" 中的 'er'
  2. 分組使用 (),做用是提取相匹配的字符串,使量詞做用於分組 好比 lalala{4}是把 a匹配了3次而不是單詞,若是但願做用於單詞,可使用分組 (lalala){4}
// 分組一個經常使用的用法 一個分組按照從左往右的順序分爲$1 $2 $3... 使用replace能夠對分組進行操做
  '231 my name is hhh'.replace(/([0-9]{2,4})/g, '$1 new add,')

  //"231 new add, my name is hhh"
//能夠用\1,\2...來引用正則表達式從左往右的第n個表達式
//匹配日期格式,表達式中的\1表明重複(\-|\/|.)
  var rgx =/\d{4}(\-|\/|.)\d{1,2}\1\d{1,2}/
  rgx.test("2016-03-26")
              
  // true
  rgx.test("2016-03.26")
              
  // false

其餘一些高級用法後面遇到了再講解~regexp

步入正題,分析一個郵箱正則表達式

例子

/^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/

當咱們看到正則第一印象是看他的分組,通常複雜的正則表達式都是由不一樣的分組組成ip

第一個分組內容^([a-zA-Z]|[0-9])

[a-zA-Z] : 匹配任意大小寫字符字符串

| : 或判斷class

^ : 從最開始進行匹配test

因此第一個括號的內容就是,從最開始第一個字符匹配任意大小寫字符和數字,也就是郵箱第一個字符不能爲符號基礎

第二個分組內容 (\w|-)+

\w : 匹配包括下劃線的任何單詞字符。等價於「[A-Za-z0-9_]」

\-: 任何符號須要匹配成字符串而忽略它真正的正則含義都須要加上\ , \ + 爲匹配加號字符串

\+ : 匹配一次或者屢次

由此可知,這個分組是用來匹配郵箱的用戶名的能夠填入任何字符或者-號

第三部分 @[a-zA-Z0-9]+

這一部分是匹配郵箱服務商的正則好比 @163這類的

第四部分\.([a-zA-Z]{2,4})$

\. : 匹配字符點

{2, 4}: 將前一個類匹配2到4次

$ : 從最後開始匹配

這部分主要是用來匹配郵箱後面的 .com .cn之類的

相關文章
相關標籤/搜索