爲何要使用正則表達式javascript
正則表達式經過由普通字符和特殊字符組成的文字模板完成對字符串的校驗,搜索,替換。在javascript中相似這樣
上面的這個簡單的正則用來匹配手機號
至於說正則表達式到底有什麼意義,藉由《精通正則表達式》裏面的一句話來歸納好了。
「若是羅列計算機軟件領域的偉大發明,我相信絕對不會超過二十項,在這個名單當中,固然應該包括分組交換網絡,Web,Lisp,哈希算法,UNIX,編譯技術,關係模型,面向對象,XML這些大名鼎鼎的傢伙,而正則表達式也絕對不該該被漏掉。
對不少實際工做而言,正則表達式簡直是靈丹妙藥,可以成百倍的提升開發效率和程序質量。」
正則表達式的生成java
在javascript中生成正則表達式的方式有兩種
正則表達式的組成正則表達式
正則表達式的文字模板是有不少不一樣類型的字符組成的,包括:
元字符,轉義字符,限定符,字符組,或結構,括號分組
元字符
字符
|
含義
|
. |
匹配除了換行符(n)之外的全部字符 |
w |
匹配字母,數字,或者漢字 |
W |
匹配除了字母,數字,漢字之外的其餘字符 |
d |
匹配數字 |
D |
匹配除了數字之外的其餘字符 |
s |
匹配任意的空白符(f, n, r, t, v) |
S |
匹配空白符之外的任意字符 |
b |
匹配單詞的開始或者結束 |
B |
匹配單詞的非開始或者結束 |
^ |
匹配行首 |
$ |
匹配行尾 |
轉義字符
* + ? | { [ ( ) ] }^ $ . # 和 空白 這些字符都是須要轉義的。例如咱們要匹配{。
限定符
字符
|
含義
|
* |
匹配零次至屢次 |
+ |
匹配一次至屢次 |
? |
匹配零次或一次 |
{2,} |
至少匹配兩次 |
{10} |
匹配10次 |
{{2, 8}} |
至少匹配兩次之多匹配八次 |
字符組[]
中括號字符組用來匹配括號內的字符之一
- 'fasfagxfasdfyfasfz'.split(/[xyz]/) //["fasfag", "fasdf", "fasf", ""]
複製代碼
還有一種排除性字符組
- 'xaxbycz'.split(/[^xyz]/) //["x", "x", "y", "z"]
複製代碼
或結構 |
例如c|d匹配或者d
- /c|d/.test('af') // false
- /c|d/.test('ad') // true
複製代碼
括號分組
(cd){1,} 能夠匹配cdcd..等, 其中cd即是一個分組。
- /(cd){1,}$/.test('cdcd') //true
複製代碼
貪婪模式和非貪婪模式算法
默認狀況下,全部的限定詞都是貪婪模式,表示儘量多的去捕獲字符。而在限定詞後增長「?」,則是非貪婪模式,表示儘量少的去捕獲字符。
- 'ccccccd'.match(/c+/) //["ccccc"], 貪婪模式, 捕獲全部
- 'ccccccd'.match(/c+?/) //["c"], 非貪婪模式, 只捕獲到第一
複製代碼
捕獲分組segmentfault
在實際應用中咱們頗有可能須要獲取到匹配的字符串,例如咱們要將字符串"萬里碧空飄着朵朵白雲"替換成"萬里碧空沒有一朵白雲"
- "萬里碧空飄着朵朵白雲".replace(/(萬里碧空)飄着朵朵白雲/, '$1沒有一朵白雲')
複製代碼
捕獲性分組會建立反向引用,js中能夠經過 $+number 或者 "反斜槓"+number" 表示法進行引用。
注意:
反斜槓+number這種引用能夠在正則表達式中使用,可用於匹配不一樣位置的相同子串,例如:
- 'www.bai.bai.com'.replace(/([a-z]+)\.\1/, '$1') // www.bai.com
複製代碼
非捕獲性分組
非捕獲性分組,一般由一對括號加上」?:」加上子表達式組成,非捕獲性分組不會建立反向引用,就好像沒有括號同樣。捕獲性分組和無捕獲性分組在搜索效率方面也沒什麼不一樣,沒有哪個比另外一個更快。
正則表達式的方法數組
test
檢索字符串中的指定子串,返回布爾值
- /^\d[a-zA-Z]{3}$/.test('1aac') // true
複製代碼
exec
返回一個數組,數組中的第一個條目是第一個匹配
- /^\d[a-zA-Z]{3}$/.exec('1aac') // ["1aac"]
複製代碼
String可使用正則表達式的方法網絡
search
返回子串的開始位置
- 'a12b2334c34'.search(/\d{4}/) // 4
複製代碼
match
返回匹配到的子串
- 'a12b2334c34'.match(/\d{4}/) // ["2334"]
複製代碼
replace
替換匹配到的子串
- 'a12b2334c34'.replace(/\d{4}/, 'cccc') // "a12bccccc34"
複製代碼
split
將字符串分割成數組
- 'a12b2334c34'.split(/\d{4}/) // ["a12b", "c34"]
複製代碼
斷言函數
正向先行斷言 (?=exp)
表明字符串中的一個位置,緊接該位置以後的字符序列可以匹配 exp
- /f(?=234)/.test('123abcf234acd') //true
複製代碼
負向先行斷言(?!exp)
表明字符串中的一個位置,緊接該位置以後的字符序列不能匹配 exp
- /f(?!234)/.test('123abcf234acd') //false
複製代碼
經常使用的正則表達式spa
Email 地址:
- ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
複製代碼
URl驗證
- [a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
複製代碼
密碼驗證
- (?!^[0-9]+$)(?!^[A-z]+$)(?!^[^A-z0-9]+$)^[^\s\u4e00-\u9fa5]{6,16}$
複製代碼
郵編驗證
手機號碼驗證
漢字驗證