一三热、什么是正則表達式
Regular Expression使用單個字符串來描述凤优、匹配一系列符合某個語句規(guī)則的字符串缝其。簡單的說就是按照某種規(guī)則去匹配符合條件的字符串,目的可以是替換或者查找等等。這里推薦一個網(wǎng)站:http://regexper.com采缚。
1似将、生成正則表達式
在javascript中我們通過內(nèi)置對象RegExp來生成一個正則表達式获黔,有兩種方式支持:
1、自變量在验。
var reg= /\bdog\b/g;
var test ='he is a dog,he is a dog ,where is she?';
test.replace(reg, 'boy')//he is a boy,he is a boy ,where is she?’
2、實例化構(gòu)造函數(shù)
var reg = new RegExp('\\bdoy\\b','g')
var test ='he is a dog,he is a dog ,where is she?';
test.replace(reg, 'boy')//he is a boy,he is a boy ,where is she?’
2堵未、正則表達式中的修飾符
g:global,表示全文搜索腋舌,不添加,搜索到第一個匹配停止渗蟹,
i:ignore case 忽視大小寫块饺,默認大小寫敏感,
m: multiple lines 多行搜索雌芽,
3授艰、正則表達式中的元字符
正則表達式有兩種基本的元字符組成:1 原義本字符(符合原本的字符,例如'a'就是去匹配'a')世落;2元字符(在正在表達式中有特殊含義的非字母字符, 例如'\b'表示單詞邊界)
4淮腾、正則表達式中的字符類
1、一般情況下正則表達式一個字符對應(yīng)字符串一個字符屉佳,但有時候我們也需要匹配一類字符谷朝,這個時候我們用元字符[]去構(gòu)建一個簡單的類。這個類是泛指的武花,可以是其中一個圆凰。
var test = 'a1b2c3d4';
var reg = /[abc]/g
test.replace(reg,'Q')//"Q1Q2Q3d4"
2、字符類取反
使用元字符^創(chuàng)建一個反向類体箕,反向類意思是不屬于某個類:
var test = 'a1b2c3d4';
var reg =/[^abc]/g
test.replace(reg,'Q')//"aQbQcQQQ"
3专钉、范圍類
正則表達式提供了一個范圍類挑童,例如我們可以使用[a-z]表示我們可以使用a到z的任意字符,這是一個閉區(qū)間包含了a和z本身跃须。
var test = 'a1b2c3d4';
var reg =/[a-z]/g
test.replace(reg,'Q')//"Q1Q2Q3Q4"
當然[]接受連寫站叼,[a-zA-Z]表示大小a到z或者A-Z。
var test = 'a1b2c3d4WTU';
var reg =/[a-zA-Z]/g
test.replace(reg,'Q')//"Q1Q2Q3Q4QQQ"
萬一我們想匹配'-',怎么辦呢回怜?
var test = '2016-11-11';
var reg =/[0-9]/g
test.replace(reg,'Q')//"QQQQ-QQ-QQ"
var newreg =/[0-9-]/g//只需在后面在加-
test.replace(newreg ,'Q')//QQQQQQQQQQ
4大年、預(yù)定義類
.等價于[^\r\n] //出來回車和換行之外的所有字符
\d 等于[0-9]//數(shù)字字符
\D 等于[^0-9]//非數(shù)字字符
\s 等于[\t\n\x0B\f\r]//空白符
\S 等于[^\t\n\x0B\f\r]//非空白符
\w 等于[a-zA-Z_0-9]//單詞字符(字母,數(shù)字及下劃線)
\W 等于[a-zA-Z_0-9]//非單詞字符(字母玉雾,數(shù)字及下劃線)
例如要匹配一個ab加數(shù)字加任意字符:
var reg =/ab[0-9][^\r\n]/g
var somereg =/ab\d./g;//這兩者是一樣的但是一個更加簡短
5翔试、正則表達式邊界
^表示以xxx開始;
$表示以xxx結(jié)束;
\b表示單詞邊界;
\B表示非單詞邊界;
5、正則表達式中的量詞
如果你在正則表達式中需要匹配100次數(shù)字复旬,那應(yīng)該怎么操作呢垦缅?
?表示出現(xiàn)零次或者一次(最多出現(xiàn)一次)
+表示出現(xiàn)一次或者多次(最少出現(xiàn)一次)
*表示出現(xiàn)零次或者多次(任意次)
{n}表示出現(xiàn)n次
{n,m}出現(xiàn)n到m次
{n,}至少出現(xiàn)n次
6、正則表達式中的模式
正則表達式有貪婪模式和非貪婪模式:
貪婪模式就是經(jīng)可能多的匹配:
var reg =/\d{3,6}/g;
var test='1234567';
test.replace(reg,'Y')//"Y7",匹配6次驹碍。
非貪婪模式就是經(jīng)可能少的匹配:
var reg =/\d{3,6}?/g;
var test='1234567';
test.replace(reg,'Y')//"YY7",匹配3次壁涎。
7、正則表達式分組
在javascript中使用()可以打到分組的目的志秃。
var reg = /([a-z]\d){3}/g;//匹配一個字母和任意數(shù)字
var test = 'q1w2e3r4t5';
test.replace(reg,'Y')//"Yr4t5"
正則表達式中的或:
var reg = /by(ess|hey)ee/g;//匹配byessee或者byheyee
var test = 'byesseebyheyeea';
test.replace(reg,'Y')//"YYa"
方向引用:
var reg = /(\d{4})-(\d{2})-(\d{2})/g;
var test = '2016-12-12';//=>12-12-2016
test.replace(reg,'$2-$3-$1')//"12-12-2016"
有時候我們需要忽略分組:
var reg = /(?:\d{4})-(\d{2})-(\d{2})/g;//只需在分組前面加上?:
var test = '2016-12-13';//=>12-12-2016
test.replace(reg,'$2-$4-$1')//"13-$4-12"
7怔球、正則表達式的前瞻
正則表達式從文本從不開始解析再到尾部,順方向稱為'前'浮还,所謂前瞻就是正則表達式在匹配到規(guī)則的時候在前前部去檢查斷言部分竟坛。
javascript中的正則支持正向前瞻(exp(?=assert))和負向前瞻(exp(?!assert))
var test ='a1b2c3vv';
var reg=/\w(?=\d)/g;
test.replace(reg,'Y')//"Y1Y2Y3vv"
這里我們只匹配了'a1b2c3'這部分中的‘a(chǎn)bc’,因為我們還檢查了斷言部分(?=/d),但是不參與替換。
var test ='a1b2c3vv';
var reg=/\w(?!\d)/g;//任意字符斷言部分不是數(shù)字的字符
test.replace(reg,'Y')//"aYbYcYYY"
二钧舌、javascript正則表達式對象屬性
屬性
lastIndex:是當前表達式匹配內(nèi)容的最后一個字符的下一個位置(下一次匹配從哪里開始)担汤,
source:正則表達式文本字符串(/..../里面的內(nèi)容)
方法
test():用于測試字符串參數(shù)中是否存在匹配正則表達式規(guī)則的字符串,存在返回true,反之false洼冻。建議用test的時候不要加g崭歧、i等等,因為反復(fù)test之后lastindex這個貨影響test結(jié)果
var something ='ab';
var reg=/\w/g;
reg.test(something)//true
reg.test(something)//true
reg.test(something)//false
while(reg.test(something)){
console.log(reg.lastIndex)
}//1.2第一次匹配到a,下次開始位置就是b(1)
exec():使用正則表達式規(guī)則對字符串進行搜索撞牢,并將更新全局RegExp對象的屬(lastIndex屬性)性以反映匹配結(jié)果率碾,如果沒有匹配返回null,反之能返回一個數(shù)組普泡,這個數(shù)組也有兩個屬性index(聲明匹配文本的第一個字符位置)和input(存放被檢索字符串的string)
var something ='ab2s2ad3e2re5e2e';
var reg1=/\d(\w)\d/;
var reg2=/\d(\w)\d/g;
var ret= reg1.exec(something)
console.log(reg1.lastIndex+'\t'+ret.index+'\t'+ret.toString());//0 2 2s2,s
while(ret =reg2.exec(something)){
console.log(reg2.lastIndex+'\t'+ret.index+'\t'+ret.toString());
}//5 2 2s2,s ;10 7 3e2,e;15 12 5e2,e
reg1.lastIndex打印出0那是因為沒有全局調(diào)用g播掷。reg2.lastIndex表示第一次匹配的是'2s2',那下一次的位置就是后面的’a‘自然是第5個位置撼班,ret.index都打印出2表示符合規(guī)則的’2s2‘第一次出現(xiàn)的位置是2歧匈,全局調(diào)用則會繼續(xù)查找10和15,ret.index也是如此。
ES6關(guān)于正則也有一些添加砰嘁,之后在補充件炉。