正則表達(dá)式
正則表達(dá)式,又稱規(guī)則表達(dá)式。(英語(yǔ):Regular Expression癌椿,在代碼中常簡(jiǎn)寫為regex、regexp或RE)缓醋,計(jì)算機(jī)科學(xué)的一個(gè)概念如失。正則表通常被用來檢索、替換那些符合某個(gè)模式(規(guī)則)的文本送粱。正則并不是js所獨(dú)有的褪贵,他是獨(dú)立與任何語(yǔ)言之外的,很多的編程語(yǔ)言都支持使用正則規(guī)則對(duì)字符串進(jìn)行一些復(fù)雜的操作抗俄。
正則在js中是以對(duì)象的形式存在的脆丁,和日期對(duì)象,數(shù)組對(duì)象類似
創(chuàng)建正則對(duì)象的方式
- 傳統(tǒng): new RegExp()
- 簡(jiǎn)寫: //
var re1 = new RegExp('a'); //參數(shù)接收字符串动雹,字符串:正則規(guī)則的內(nèi)容
console.log(re1); /a/
var re2 = /a/;
console.log(re2); /a/
var re3 = /\d/;
console.log(re3); /\d/
*//如果使用傳統(tǒng)的方式來創(chuàng)建一個(gè)正則對(duì)象槽卫,那么字符串會(huì)被默認(rèn)先進(jìn)行解析,然后把解析后的字符串作為參數(shù)傳給正則對(duì)象
var re4 = new RegExp('\d')
console.log(re4); /d/
*//首先\d會(huì)被字符串解析成字符d胰蝠,然后在把解析后的d作為參數(shù);
var re5 = new RegExp('\\d');
console.log(re5); /\d/
var usename = 'zzaall';
*// 如果我們通過簡(jiǎn)寫的形式歼培,那么 // 中的字符是不會(huì)被js作為特殊數(shù)據(jù)解析的,比如變量茸塞,如果我們的正則中有通過變量來表示的內(nèi)容躲庄,那么簡(jiǎn)寫的方式就不適合了
var re6 = /usename/;
console.log(re6); /usename/
var re7 = new RegExp(username)
console.log(re7); /zzaall/
正則.test(字符串)
檢測(cè)參數(shù)字符串中是否包含有正則對(duì)象所匹配的內(nèi)容,如果有返回true,如果沒有就返回false
console.log(/\d/.test('abc1degfg')) //true
\d: 一個(gè)數(shù)字
字符串.search(字符串/正則)
查找參數(shù)的內(nèi)容在前面字符串中首次出現(xiàn)的位置钾虐,如果沒有返回-1.和indexOf很類似噪窘,但是他和indexOf有一個(gè)最大的區(qū)別是:indexOf參數(shù)只支持字符串,search還可以支持正則
console.log('abcde'.search('a')); 0
console.log('abcde'.search('b')); 1
console.log('abcde'.search(/a/)); 0
console.log('a2bcde'.search(/\d/)); 1
console.log('bacds'.search(/A/i)); 1
console.log('bacds'.search( new RegExp('A', 'i') )); 1
i: ignore 忽略 大小寫
修飾符: 對(duì)正則表達(dá)式內(nèi)容的強(qiáng)調(diào)與說明
字符串.match(正則)
在前面的字符串中查找和參數(shù)匹配的內(nèi)容效扫,并保存到一個(gè)數(shù)組中返回
var str = 'j234hj2g42jh4j2k1';
console.log( str.match(/\d/) ); // 2 一個(gè)數(shù)組倔监,保存第一個(gè)數(shù)字出現(xiàn)
console.log( str.match(/\d/g) );// 2,3,4,2,4,2,4,2,1所有數(shù)字的數(shù)組
模式:
- 懶惰: 如果使用懶惰模式進(jìn)行內(nèi)容匹配,那么當(dāng)找到一個(gè)匹配結(jié)果的時(shí)候菌仁,就終止繼續(xù)執(zhí)行
- 非懶惰: g : global 全局查找浩习,修飾符
var str = 'j234hj2g42jh4j2k1';
console.log( str.match(/\d+/g) ); //234,2,42,4,2,1
+: 表示+的前一個(gè)規(guī)則最少匹配一次,最多不限,量詞
模式:貪婪:當(dāng)一組結(jié)果中的內(nèi)容有多個(gè)滿足的時(shí)候掘托,正則會(huì)選擇最大化的結(jié)果作為最終結(jié)果
字符串.replace(要查找的內(nèi)容, 要替換的內(nèi)容)
在前面的字符串中查找第一個(gè)參數(shù)指定的內(nèi)容瘦锹,并用第二個(gè)參數(shù)的內(nèi)容進(jìn)行替換
console.log('asdasda'.replace('a','*')); //*sdasda
*/簡(jiǎn)單的字符串替換,只會(huì)替換一次,如果我們需要進(jìn)行一些更為復(fù)雜的查找和替換,那么就需要使用正則來進(jìn)行
console.log( 'asdasda'.replace(/a/gi, '*') ); //*sd*sd
replace
- 第一個(gè)參數(shù):既可以接收普通的字符串弯院,也可以接收正則對(duì)象
- 第二個(gè)參數(shù):既可以接收普通的字符串辱士,還可以接收一個(gè)函數(shù)(回調(diào))
敏感詞替換
//我們可以根據(jù)當(dāng)前這次匹配的內(nèi)容長(zhǎng)度來動(dòng)態(tài)的返回不同個(gè)數(shù)的*
var str = '西紅柿是紅色的';
var newStr = str.replace(/西紅柿|紅色/g,function(a){;
console.log(a); //西紅柿 紅色
var s = '';
for(var i = 0;i < a.lenfth;i++){
s += '*'
}
return s;
});
console.log(newStr);
//***是**的
子項(xiàng)
var d1 = '2017-7-17';
function formatDate(str){
return str.replace(/(\d+)\D+(\d+)\D+(\d+)/,function($0,$1,$2,$3){
// 第一個(gè)參數(shù)($0):當(dāng)前整個(gè)正則所匹配的內(nèi)容,后面的參數(shù)是每個(gè)()里的內(nèi)容
console.log($0); //2017-7-17
console.log($1); //2017
console.log($2); //7
console.log($3); //17
return $1 + '年' + $2 + '月' + $3 + '日';
})
}
console.log(formatDate(d1));
\D: 一個(gè)非數(shù)字
(): 子項(xiàng)听绳; 范圍(提權(quán))颂碘,會(huì)在結(jié)果中保留(提供)子項(xiàng)當(dāng)前匹配的內(nèi)容
從左至右,從外至里 也可以 根據(jù) ( 出現(xiàn)的順序來
范圍選擇
var str = 'a1ba2ba3baaba4b';
//a開頭b結(jié)尾中間是數(shù)字 (a數(shù)字b)
console.log(str.replace(/a\db/g, '*')); ***aab*
//a開頭b結(jié)尾中間是1或2或3
console.log(str.replace(/a(1|2|3)b/g, '*')); ***aaba4b
// [] 中的值是被選值椅挣,匹配其中的一個(gè)
console.log(str.replace(/a[123]b/g, '*')); ***aaba4b
console.log(str.replace(/a[123456789]b/g, '*')); ***aab*
console.log(str.replace(/a[1-9]b/g, '*')); ***aab*
console.log(str.replace(/a[a-z]b/g, '*')); a1ba2ba3b*a4b
console.log(str.replace(/a[A-Z]b/g, '*')); a1ba2ba3baaba4b
console.log(str.replace(/a[a-zA-Z]b/g, '*')); a1ba2ba3b*a4b
// 匹配的是1-5或7
console.log(str.replace(/a[1-57]b/g, '*')); ***aab*
//問題:匹配1-57
/[1-9]|[1-4]\d|5[0-7]/
反向選擇 ^
var str = 'a1ba2ba3baaba4ba5ba6ba7b';
// ^ 在 [] 中使用头岔,表示反向選擇的意思,只能在 [] 的開始 ,除了1 2的
console.log(str.replace(/a[^12]b/g, '*')); a1ba2b******
起始符和結(jié)束符
在正則中
^ : 字符串的起始鼠证; $ : 字符串的結(jié)尾
量詞
- {n} 只能n次
- {n,} 最少n次峡竣,最多不限
- {n,m} 最少n次,最多m次
檢測(cè)qq號(hào)
var qq = '200824584'
console.log(/^[1-9]\d{4,11}$/.test(qq)); true
//第一位是1-9之間的數(shù)量九,后面數(shù)字在4到11位之間
常用正則符號(hào)
\d : 一個(gè)數(shù)字
\D : 一個(gè)非數(shù)字
\w : 一個(gè)字符(字母數(shù)字下劃線)
\W : 一個(gè)非字符(字母數(shù)字下劃線)
\s : 一個(gè)空格
\S : 一個(gè)非空格
\b : 一個(gè)邊界符适掰,如果一個(gè)字母數(shù)字下劃線的左側(cè)或右側(cè)不在是一個(gè)字母數(shù)字下劃線,那么這里就會(huì)有一個(gè)符號(hào):邊界符
\B : 一個(gè)非邊界符
. : 任意字符荠列,除了換行符
重復(fù)子項(xiàng)
{n} : {n}表示的是一個(gè)數(shù)字 \1 \2 \3
//重復(fù)第n個(gè)子項(xiàng)匹配的內(nèi)容
/(a)b\1/ // \1必須和第一個(gè)子項(xiàng)的內(nèi)容是一致的
/(\d)a\1/ // \1位置上的內(nèi)容必須和第一個(gè)子項(xiàng)的內(nèi)容保持一致
var str = 'aaaaaabbbbbbjjjjjtttttttttttiiiidddd';
var n = 0;
var s = '';
str.replace(/(\w)\1+/g, function($0, $1) {
if ($0.length > n) {
n = $0.length;
s = $1;
}
});
console.log('出現(xiàn)次數(shù)最多的是' + s + '类浪,一共出現(xiàn)了' + n + '次');
//出現(xiàn)次數(shù)最多的是t,一共出現(xiàn)了11次