一、匹配規(guī)則
1).可以匹配任意字符,即'js.'可以匹配'jsp'/'jsx'/'js!'
2)\d可以匹配一個(gè)數(shù)字,即'00\d'可以'007',但無法匹配'00A'
??????'\d\d\d'可以匹配'010'
3)\w可以匹配一個(gè)字母或者數(shù)字,即'\w\w'可以匹配'js'
4)\s表示空白字符
)\S表示非空白字符
)\t表示制表符
)\r表示回車符
4)*表示任意個(gè)字符(包括0個(gè))
5)+表示至少一個(gè)字符
6)用?表示0個(gè)或1個(gè)字符
7)用{n}表示n個(gè)字符
8)用{n,m}表示n-m個(gè)字符
二、案例分析
分析一:
??????\d{3}\s+\d{3,8}
??????\d{3}表示匹配3個(gè)數(shù)字,例如'010'
??????\s+表示匹配至少一個(gè)空白字符,例如 ''/'\t\t'等
??????\d{3,8}表示匹配3到8個(gè)數(shù)字,例如 '1234567'
??????綜合起來,上面的正則表達(dá)式可以匹配以任意個(gè)空格隔開的帶區(qū)號(hào)的電話號(hào)碼;
??????\d{3}\-\d\{3,8}可以匹配'010-12345'這樣的號(hào)碼,由于'-'是特殊字符,需要用\轉(zhuǎn)義
分析二:
??????[0-9a-zA-Z\_]可以匹配一個(gè)數(shù)字、字母或者下劃線;
??????[0-9a-zA-Z\_]+可以匹配至少由一個(gè)數(shù)字、字母或者下劃線組成的字符串,比如'a100','0_Z','js2015'
??????[a-zA-Z\_\$][0-9a-zA-Z\_\$]*可以匹配由字母或下劃線、$開頭,后接任意個(gè)由一個(gè)數(shù)字、字母或者下劃線、$組成的字符串,也就是JavaScript允許的變量名
??????[a-zA-Z\_\$][0-9a-zA-Z\_\$]{0,19}更加精確地限制了變量的長度是1-20個(gè)字符(前面1個(gè)字符+后面最多19個(gè)字符)
??????A|B可以匹配A或B,所以(J|j)ava(S|s)cript可以匹配JavaScript,Javascript,javaScript或者javaScript
??????^表示行的開頭,^\d表示必須以數(shù)字開頭
??????$表示行的結(jié)束,\d$表示必須以數(shù)字結(jié)束,^js$變成了整行匹配,只能匹配js
RegExp
創(chuàng)建正則表達(dá)式的方法:
??????1)使用/正則表達(dá)式/寫出來;
??????2)通過new RegExp('正則表達(dá)式')創(chuàng)建一個(gè)RegExp對(duì)象;
var re1 = /ABC\-001/;
var re2 = new RegExp(/ABC\\-001/);
console.log(re1); // /ABC\-001/
console.log(re2); // /ABC\\-001/
test()方法
// test()方法用于測(cè)試給定的字符串是否符合條件
var re = /^\d{3}\-\d{3,8}$/;
console.log(re.test('010-12345')); // true
console.log(re.test('010-1234x')); // false
console.log(re.test('010 12345')); // false
切分字符串split
var str1 = 'a b c';
var str2 = 'a,b c';
var str3 = 'a,b;;c d';
console.log(str1.split(' ')); // ["a", "b", "", "", "c"]
console.log(str1.split(/\s+/)); // ["a", "b", "c"]
console.log(str2.split(/[\s\,]+/)); // ["a", "b", "c"]
console.log(str3.split(/[\s\,\;]+/)); // ["a", "b", "c", "d"]
分組exec
???????如果正則表達(dá)式中定義了組,就可以在RegExp對(duì)象上用exec()方法提取出子串來,exec()方法在匹配成功后,會(huì)返回一個(gè)Array,第一個(gè)元素是正則表達(dá)式匹配到的整個(gè)字符串,后面的字符串表示匹配成功的子串;exec()方法在匹配失敗時(shí)會(huì)返回null;
var re = /^(\d{3})-(\d{3,8})$/;
console.log(re.exec('010-12345')); // ['010-12345', '010', '12345']
console.log(re.exec('010 12345')); // null
貪婪匹配 +?
???????正則匹配默認(rèn)是貪婪匹配,也就是匹配盡可能多的字符;
// \d+采用貪婪匹配,直接把后面的0全部匹配了,結(jié)果0*只能匹配空字符串了
var re = /^(\d+)(0*)$/;
console.log(re.exec('102300')); // ['102300', '102300', '']
// 讓\d+采用非貪婪匹配(也就是盡可能少匹配),才能把后面的0匹配出來,加個(gè)?就可以讓\d+采用非貪婪匹配
var re = /^(\d+?)(0*)$/;
console.log(re.exec('102300')); // ['102300', '1023', '00']
全局搜索 g
var r1 = /test/g;
// 等價(jià)于:
var r2 = new RegExp('test', 'g');
var s = 'JavaScript, VBScript, JScript and ECMAScript';
var re=/[a-zA-Z]+Script/g;
// 使用全局匹配:
re.exec(s); // ['JavaScript']
re.lastIndex; // 10
re.exec(s); // ['VBScript']
re.lastIndex; // 20
re.exec(s); // ['JScript']
re.lastIndex; // 29
re.exec(s); // ['ECMAScript']
re.lastIndex; // 44
re.exec(s); // null,直到結(jié)束仍沒有匹配到
search() 方法
???????用于檢索字符串中指定的子字符串,或檢索與正則表達(dá)式相匹配的子字符串;返回第一個(gè)與 regexp 相匹配的子串的起始位置,如果沒有找到任何匹配的子串,則返回 -1,默認(rèn)不執(zhí)行全局匹配;
match() 方法
???????找到一個(gè)或多個(gè)與 regexp 匹配的方法,但這個(gè)方法在很大程序上有賴于 regexp 是否有標(biāo)志g,如果沒有標(biāo)志g,那么match() 方法就只能執(zhí)行一次匹配,如果沒有找到任何匹配的廣本,match() 方法將返回null;
???????如果有標(biāo)志g,則 match() 方法將執(zhí)行全局檢索,找到所有匹配子字符串,若沒有找到任何匹配的子串,則返回 null;
replace()方法
???????如果 regexp 具有全局標(biāo)志 g,那么 replace() 方法將替換所有匹配的子串,否則,它只替換第一個(gè)匹配子串;
name = '"a", "b"';
document.write(name.replace(/"([^"]*)"/g, "'$1'")); // 'a','b'