摘要: 正則表達式入門教程。javascript
Fundebug經受權轉載,版權歸原做者全部。java
正則表達式是不少程序員,甚至是一些有了多年經驗的開發者薄弱的一項技能。你們都不少時候都會以爲正則表達式難記、難學、難用,但不能否認的是正則表達式是一項很重要的技能,全部我將學習和使用正則表達式時的關鍵點整理以下,供你們參考。程序員
不一樣語言中的正則表達式寫法有少量差別,本文將使用 Javascript 中的語法。正則表達式
正則表達式(Regular Expression 或 Regex),是用於定義某種特定搜索模式的字符組合。正則表達式可用於匹配、查找和替換文本中的字符,進行輸入數據的驗證,查找英文單詞的拼寫錯誤等。express
下面列出了幾款優秀的在線調試工具,若是你想建立或者調試正則表達式可能會須要。我的比較偏好Regex101,regex101 支持在正則表達式的不一樣 flavor 之間切換、解釋你的正則表達式、顯示匹配信息、提供經常使用語法參考等功能,很是強大。編程
在 Javascript 中,一個正則表達式以 /
開頭和結尾,因此簡單至 /hello regexp/
就是一個正則表達式。小程序
Flags 寫在結束的/
以後,能夠影響整個正則表達式的匹配行爲。常見的 flags 有:segmentfault
g
:全局匹配(global);正則表達式默認只會返回第一個匹配結果,使用標誌符g
則能夠返回全部匹配i
:忽略大小寫(case-insensitive);在匹配時忽略英文字母的大小寫m
:多行匹配(multiline);將開始和結束字符(^和$)視爲在多行上工做,即分別匹配每一行(由 \n
或 \r
分割)的開始和結束,而不僅是隻匹配整個輸入字符串的最開始和最末尾處Flags 能夠組合使用,如:微信小程序
用於匹配字符集合中的任意一個字符,常見的字符集有:數組
[xyz]
:匹配 "x"
或"y"``"z"
[^xyz]
:補集,匹配除 "x" "y" "z"
的其餘字符[a-z]
:匹配從 "a"
到 "z"
的任意字符[^a-n]
:補集,匹配除 "a"
到 "n"
的其餘字符[A-Z]
:匹配從 "A"
到 "Z"
的任意字符[0-9]
:匹配從 "0"
到 "9"
的任意數字好比匹配全部的字母和數字能夠寫成:/[a-zA-Z0-9]/
或者 /[a-z0-9]/i
。
在實際使用中,咱們經常須要匹配同一類型的字符屢次,好比匹配 11 位的手機號,咱們不可能將 [0-9]
寫 11 遍,此時咱們可使用 Quantifiers 來實現重複匹配。
{n}
:匹配 n
次{n,m}
:匹配 n-m
次{n,}
:匹配 >=n
次?
:匹配 0 || 1
次*
:匹配 >=0
次,等價於 {0,}
+
:匹配 >=1
次,等價於 {1,}
在正則表達式中有一些具備特殊含義的字母,被稱爲元字符,簡言之,元字符就是描述字符的字符,它用於對字符表達式的內容、轉換及各類操做信息進行描述。
常見的元字符有:
\d
:匹配任意數字,等價於 [0-9]
\D
:匹配任意非數字字符;\d
的補集\w
:匹配任意基本拉丁字母表中的字母和數字,以及下劃線;等價於 [A-Za-z0-9_]
\W
:匹配任意非基本拉丁字母表中的字母和數字,以及下劃線;\w
的補集\s
:匹配一個空白符,包括空格、製表符、換頁符、換行符和其餘 Unicode 空格\S
:匹配一個非空白符;\s
的補集\b
:匹配一個零寬單詞邊界,如一個字母與一個空格之間;例如,/\bno/
匹配 "at noon"
中的 "no"
,/ly\b/
匹配 "possibly yesterday."
中的 "ly"
\B
:匹配一個零寬非單詞邊界,如兩個字母之間或兩個空格之間;例如,/\Bon/
匹配 "at noon"
中的 "on"
,/ye\B/
匹配 "possibly yesterday."
中的 "ye"
\t
:匹配一個水平製表符(tab)\n
:匹配一個換行符(newline)\r
:匹配一個回車符(carriage return)正則中存在一些特殊字符,它們不會按照字面意思進行匹配,而有特殊的意義,好比前文講過用於量詞的?
、*
、+
。其餘常見的特殊字符有:
\
:轉義字符,能夠將普通字符轉成特殊字符。好比 \w
;也能夠將特殊字符轉成字面意思,好比 \+
匹配 "+"
.
:匹配任意單個字符,可是換行符除外:\n
, \r
, \u2028
或 \u2029
;在字符集中([.]
),無特殊含義,即表示 '.'
的字面意思|
:替換字符(alternate character),匹配 |
前或後的表達式。好比須要同時匹配 "bear"
和 "pear"
,可使用 /(b|p)ear/
或者 /bear|pear/
;可是不能用 /b|pear/
,該表達式只能匹配 "b"
和 "pear"
^
:匹配輸入的開始。好比,/^A/
不匹配 "an Apple"
中的 "A"
,但匹配 "An apple"
中的 "A"
$
:匹配輸入的結尾。好比,/t$/
不匹配 "eater"
中的 "t"
,但匹配 "eat"
中的 "t"
。^
和 $
在表單驗證時常須要使用,由於須要驗證從開始到結尾的一個完整輸入,而不是匹配輸入中的某一段(xyz)
:捕獲分組(Capturing Group),匹配並捕獲匹配項;例如,/(foo)/
匹配且捕獲 "foo bar."
中的 "foo"
。被匹配的子字符串能夠在結果數組的元素 [1], ..., [n] 中找到,或在被定義的 RegExp 對象的屬性 $1, ..., $9 中找到(?:xyz)
:非捕獲分組(Non-capturing Group),匹配但不會捕獲匹配項;匹配項不能再次被訪問到\n
:n
是一個正整數,表示反向引用(back reference),指向正則表達式中第 n 個括號(從左開始數)中匹配的子字符串;例如,/apple(,)\sorange\1/
匹配 "apple, orange, cherry, peach."
中的 "apple,orange,"
x(?=y)
:僅匹配被y
跟隨的x
;例如,/bruce(?=wayne)/
,若是"bruce"
後面跟着wayne
,則匹配之。/bruce(?=wayne|banner)/
,若是"bruce"
後面跟着"wayne"
或者banner
,則匹配之。可是,"wayne"
和 "banner"
都不會在匹配結果中出現x(?!y)
:僅匹配不被y
跟隨的x
;例如,/\d+(?!\.)/
只會匹配不被 "."
跟隨的數字。/\d+(?!\.)/.exec('3.141')` 匹配 `"141"`,而不是 `"3.141"
推薦你們使用Fundebug,一款很好用的 BUG 監控工具~
上面羅列出了這麼多正則表達式的語法和規則,能夠在必定程度上幫助咱們分析和理解一段正則表達式的做用,可是如何將這些規則組合並創造出有特定做用的表達式還須要咱們本身多加練習,下面舉幾個例子來講明運用這些規則。
咱們先從比較簡單的匹配手機號碼開始。目前國內的手機號碼是1(3/4/5/7/8)
開頭的 11 位數字,所以手機號碼的正則能夠分解爲如下幾部分:
1
開頭:/^1/
三、四、五、七、8
中的一個:/[34578]/
或 /(3|4|5|7|8)/
/\d{9}$/
組合起來即爲 /^1[34578]\d{9}$/
或 /^1(3|4|5|7|8)\d{9}$/
,由於使用捕獲括號存在性能損失,因此推薦使用第一種寫法。
標準的電子郵件組成爲 <yourname>@<domain>.<extension><optional-extension>
,
每部分的格式標準爲(進行了相應的簡化,主要爲展現如何書寫正則):
"."
開頭,後面跟任意英文字母(a-z/A-Z),長度 2-8,可選每部分的正則表達式爲:
/[a-z\d._-]+/
/[a-z\d-]+/
/[a-z]{2,8}/
/(\.[a-z]{2,8})?/
組合起來造成最後的正則表達式:/^([a-z\d._-]+)@([a-z\d-]+)\.([a-z]{2,8})(\.[a-z]{2,8})?$/
;爲了增長可讀性能夠將每部分用"()"
包起來,並不要忘記起始和結束符 ^$
。
今天關於正則表達式的普及就先到這兒,但願對你們之後寫正則能有一點幫助。關於本文中沒有涉及到的知識能夠參考如下連接:
最後,推薦你們使用Fundebug,一款很好用的 BUG 監控工具~
Fundebug專一於JavaScript、微信小程序、微信小遊戲、支付寶小程序、React Native、Node.js和Java線上應用實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了10億+錯誤事件,付費客戶有陽光保險、核桃編程、荔枝FM、掌門1對一、微脈、青團社等衆多品牌企業。歡迎你們免費試用!