****為什么要使用正則表達式****
正則表達式通過由普通字符和特殊字符組成的文字模板完成對字符串的校驗,搜索,替換吞歼。在javascript中類似這樣
/^1\d{10}$/
上面的這個簡單的正則用來匹配手機號
至于說正則表達式到底有什么意義壮虫,借由《精通正則表達式》里面的一句話來概括好了。
?“如果羅列計算機軟件領域的偉大發(fā)明思瘟,我相信絕對不會超過二十項荸百,在這個名單當中,當然應該包括分組交換網(wǎng)絡滨攻,Web够话,Lisp,哈希算法光绕,UNIX女嘲,編譯技術,關系模型诞帐,面向?qū)ο笮滥幔琗ML這些大名鼎鼎的家伙,而正則表達式也絕對不應該被漏掉停蕉。
?對很多實際工作而言愕鼓,正則表達式簡直是靈丹妙藥钙态,能夠成百倍的提高開發(fā)效率和程序質(zhì)量【軉”
****正則表達式的生成****
在javascript中生成正則表達式的方式有兩種
調(diào)用RegExp對象的構造函數(shù)
var reg = new RegExp('^[a-z] [0-9][align=left][font=微軟雅黑][size=3][color=#000000][backcolor=white]其中第一個參數(shù)是匹配模式驯绎,第二個參數(shù)是可選參數(shù)(g, i, m),分別用于指定全局匹配、區(qū)分大小寫的匹配和多行匹配谋旦。這種方式會在正則表達式運行時編譯(runtime compilation)剩失。如果你知道正則表達式模式將會改變,或者你事先不知道什么模式册着,而是從另一個來源獲取拴孤,如用戶輸入,這些情況都可以使用構造函數(shù)甲捏。[/backcolor][/color][/size][/font][/align]
[*][align=left][font=微軟雅黑][size=3][color=#000000][backcolor=white]使用正則表達式字面值演熟,將匹配模式封閉在兩個斜杠中[/backcolor][/color][/size][/font][/align][code]var reg = /^[a-z] [0-9]$/gi
當表達式被賦值時,字面量形式提供正則表達式的編譯(compilation)司顿,當正則表達式保持為常量時一般使用字面量方式芒粹。例如當你在循環(huán)中使用字面量構造一個正則表達式時,正則表達式不會在每一次迭代中都被重新編譯(recompiled)
****正則表達式的組成****
正則表達式的文字模板是有很多不同類型的字符組成的大溜,包括:
元字符化漆,轉(zhuǎn)義字符,限定符钦奋,字符組座云,或結構,括號分組
元字符
字符
含義
. 匹配除了換行符(n)以外的所有字符
w 匹配字母付材,數(shù)字朦拖,或者漢字
W 匹配除了字母,數(shù)字厌衔,漢字以外的其他字符
d 匹配數(shù)字
D 匹配除了數(shù)字以外的其他字符
s 匹配任意的空白符(f, n, r, t, v)
S 匹配空白符以外的任意字符
b 匹配單詞的開始或者結束
B 匹配單詞的非開始或者結束
^ 匹配行首
$ 匹配行尾
****轉(zhuǎn)義字符****
- ? | { [ ( ) ] }^ $ . # 和 空白 這些字符都是需要轉(zhuǎn)義的璧帝。例如我們要匹配{。
{
限定符
字符
含義
- 匹配零次至多次
匹配一次至多次
富寿? 匹配零次或一次
{2,} 至少匹配兩次
{10} 匹配10次
{{2, 8}} 至少匹配兩次之多匹配八次
字符組[]
中括號字符組用來匹配括號內(nèi)的字符之一
'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沒有一朵白云')
捕獲性分組會創(chuàng)建反向引用墩虹,js中可以通過 $ number 或者 "反斜杠" number" 表示法進行引用豌熄。
注意:
反斜杠 number這種引用可以在正則表達式中使用授嘀,可用于匹配不同位置的相同子串,例如:
'www.bai.bai.com'.replace(/([a-z] ).\1/, '$1') // www.bai.com
****非捕獲性分組****
非捕獲性分組锣险,通常由一對括號加上”?:”加上子表達式組成蹄皱,非捕獲性分組不會創(chuàng)建反向引用,就好像沒有括號一樣芯肤。捕獲性分組和無捕獲性分組在搜索效率方面也沒什么不同巷折,沒有哪一個比另一個更快。
/^(?:\d )/
****正則表達式的方法****
test
檢索字符串中的指定子串崖咨,返回布爾值
/^\d[a-zA-Z]{3}$/.test('1aac') // true
exec
返回一個數(shù)組锻拘,數(shù)組中的第一個條目是第一個匹配
/^\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
將字符串分割成數(shù)組
'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,}$