javascript正則表達式總結

爲何要使用正則表達式

正則表達式經過由普通字符和特殊字符組成的文字模板完成對字符串的校驗,搜索,替換。在javascript中相似這樣javascript

/^1\d{10}$/

上面的這個簡單的正則用來匹配手機號
至於說正則表達式到底有什麼意義,藉由《精通正則表達式》裏面的一句話來歸納好了。java

​ 「若是羅列計算機軟件領域的偉大發明,我相信絕對不會超過二十項,在這個名單當中,固然應該包括分組交換網絡,Web,Lisp,哈希算法,UNIX,編譯技術,關係模型,面向對象,XML這些大名鼎鼎的傢伙,而正則表達式也絕對不該該被漏掉。
​對不少實際工做而言,正則表達式簡直是靈丹妙藥,可以成百倍的提升開發效率和程序質量。」

正則表達式的生成

在javascript中生成正則表達式的方式有兩種正則表達式

  1. 調用RegExp對象的構造函數算法

    var reg = new RegExp('^[a-z]+[0-9]$', 'gi')

    其中第一個參數是匹配模式,第二個參數是可選參數(g, i, m),分別用於指定全局匹配、區分大小寫的匹配和多行匹配。這種方式會在正則表達式運行時編譯(runtime compilation)。若是你知道正則表達式模式將會改變,或者你事先不知道什麼模式,而是從另外一個來源獲取,如用戶輸入,這些狀況均可以使用構造函數。數組

  2. 使用正則表達式字面值,將匹配模式封閉在兩個斜槓中網絡

    var reg = /^[a-z]+[0-9]$/gi

    當表達式被賦值時,字面量形式提供正則表達式的編譯(compilation),當正則表達式保持爲常量時通常使用字面量方式。例如當你在循環中使用字面量構造一個正則表達式時,正則表達式不會在每一次迭代中都被從新編譯(recompiled)函數

正則表達式的組成

正則表達式的文字模板是有不少不一樣類型的字符組成的,包括:
元字符,轉義字符,限定符,字符組,或結構,括號分組code

元字符

字符 含義
. 匹配除了換行符(n)之外的全部字符
w 匹配字母,數字,下劃線
W 匹配除了字母,數字,下劃線之外的其餘字符
d 匹配數字
D 匹配除了數字之外的其餘字符
s 匹配任意的空白符(f, n, r, t, v)
S 匹配空白符之外的任意字符
b 匹配單詞的開始或者結束
B 匹配單詞的非開始或者結束
^ 匹配行首
$ 匹配行尾

轉義字符

* + ? | { [ ( ) ] }^ $ . # 和 空白 這些字符都是須要轉義的。例如咱們要匹配{。對象

\{

限定符

字符 含義
* 匹配零次至屢次
+ 匹配一次至屢次
匹配零次或一次
{2,} 至少匹配兩次
{10} 匹配10次
{{2, 8}} 至少匹配兩次之多匹配八次

字符組[]

中括號字符組用來匹配括號內的字符之一ip

'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"], 非貪婪模式, 只捕獲到第一個

捕獲分組

在實際應用中咱們頗有可能須要獲取到匹配的字符串,例如咱們要將字符串"萬里碧空飄着朵朵白雲"替換成"萬里碧空沒有一朵白雲"

"萬里碧空飄着朵朵白雲".replace(/(萬里碧空)飄着朵朵白雲/, '$1沒有一朵白雲')

捕獲性分組會建立反向引用,js中能夠經過 $+number 或者 "反斜槓"+number" 表示法進行引用。

注意:

反斜槓+number這種引用能夠在正則表達式中使用,可用於匹配不一樣位置的相同子串,例如:

'www.bai.bai.com'.replace(/([a-z]+)\.\1/, '$1') // www.bai.com

非捕獲性分組

非捕獲性分組,一般由一對括號加上」?:」加上子表達式組成,非捕獲性分組不會建立反向引用,就好像沒有括號同樣。捕獲性分組和無捕獲性分組在搜索效率方面也沒什麼不一樣,沒有哪個比另外一個更快。

/^(?:\d+)/

正則表達式的方法

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

經常使用的正則表達式

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}$

郵編驗證

[1-9]d{5}(?!d)

手機號碼驗證

^1\d{10}$

漢字驗證

^[\u4e00-\u9fa5]{0,}$
相關文章
相關標籤/搜索