1、正則表達(dá)式
一套規(guī)則,一般用來處理字符串的查詢和替換
1.1 創(chuàng)建正則規(guī)則
- 字面量寫法:/正則表達(dá)式的規(guī)則/
- 通過正則的構(gòu)造函數(shù)來生成一個對象:new RegExp(字符串)
這里的字符串就是規(guī)則
1.2 正則表達(dá)式的方法
-
test():匹配成功返回true,匹配失敗返回false
語法:正則規(guī)則.test(源字符串) -
match():返回匹配規(guī)則的內(nèi)容
語法:源字符.match(正則規(guī)則) -
replace():字符串方法,接受兩個參數(shù),替換
語法:源字符.replace(正則規(guī)則,字符串/函數(shù))- 第一個參數(shù):正則或者是字符串(一般使用正則)
- 第二個參數(shù):字符串或者是function,但是必須返回用于替換
-
位置置換:
-
exec():依次執(zhí)行,超過就是null
語法:正則規(guī)則.exec(源字符串)
const str = "魔道祖師真好看";
// 字面量寫法
const reg1 = /魔道祖師/; //這里不能匹配。因為兩個斜杠之間就是規(guī)則
// 正則構(gòu)造函數(shù)
const reg2 = new RegExp("魔道祖師");
console.log(reg1.test(str)); // true
console.log(reg2.test(str)); // true
1.3 特殊字符
-
1、轉(zhuǎn)義符: \ 對后面的字符的轉(zhuǎn)譯,轉(zhuǎn)義可能發(fā)生改變,可能不會
\n:換行
\t:空格
\ \:雙轉(zhuǎn)義符號,后面一個被轉(zhuǎn)義為一個普通的斜杠 -
2、元字符
\d:轉(zhuǎn)義d,判定數(shù)字0-9
\D:轉(zhuǎn)義D,非數(shù)字
\s:轉(zhuǎn)義s,空格
\S:轉(zhuǎn)義S,非空格
\w:轉(zhuǎn)義w,字符(數(shù)字,字母,_)
\W:轉(zhuǎn)義W,非字符(除了w以外的所有東西)
\b:轉(zhuǎn)義b,判斷獨立部分(單詞邊界,起始,結(jié)束,連詞符(除了\w之外的屬于連詞符))
\D:轉(zhuǎn)義D,非獨立部分 -
3、量詞:默認(rèn)是貪婪匹配,以最高次匹配
- 語法:{min, max}
最少出現(xiàn)min次,最多出現(xiàn)max次 - 特殊的量詞寫法:
{0,1} 最少出現(xiàn)0次,最多出現(xiàn)1次 = ?
{0,} 最少出現(xiàn)0次,最多出現(xiàn)無數(shù)次 = *
{1,} 最少出現(xiàn)1次,最多出現(xiàn)無數(shù)次 = +
- 語法:{min, max}
-
4、標(biāo)識符
g:全局匹配 i:不區(qū)分大小寫 m: 換行匹配 .:匹配所有的字符,除開\n \r \t -
5、起始符、結(jié)束符
^:起始符,行首
$:終止符,行尾
// test()方法
let obj = "{\"a\", 1}";
console.log(obj); // {"a", 1}
const str = "83151561";
const str2 = "asdsds";
const reg = /\d/;
const reg2 = /\D/;
console.log(reg.test(str)); // true
console.log(reg2.test(str2)); // false
const str = "good good study day day up";
const str2 = "good good study day day_up";
const str3 = "good good study day day=up";
const reg = /\bday\b/;
const reg2 = /\bday_\b/;
const reg3 = /\bday=\b/;
console.log(reg.test(str)); // true
console.log(reg2.test(str2)); // false
console.log(reg3.test(str3)); // true
const str = "123456789";
const reg = /\d\d\d/; // 匹配三個連續(xù)的數(shù)字
const reg2 = /\d{0,1}/; // 量詞的寫法
console.log(reg2.test(str)); // true
// match()方法
const str = "111111114564564111151515";
const reg = /1+/g; // 在全局匹配數(shù)字1無限次
console.log(str.match(reg)); // ["11111111", "1111", "1", "1"]
const str = "1111Abc456abc111a51b51c5";
const reg1 = /abc/; //區(qū)分大小寫
const reg2 = /abc/i; // 不區(qū)分大小寫
console.log(str.match(reg1));
// ["abc", index: 10, input: "1111Abc456abc111a51b51c5", groups: undefined]
console.log(str.match(reg2));
// ["Abc", index: 4, input: "1111Abc456abc111a51b51c5", groups: undefined]
const str = "32\n12"
const reg = /^12/m; // ^起始符
console.log(str.match(reg));
//["12", index: 3, input: "32?12", groups: undefined]
const str = "asdwjifwef";
const reg1 = /^asdwjifwef$/;
const reg = /^a\w*f$/; // 以a開頭,f結(jié)尾的所有的字符串
console.log(str.match(reg));
const str = "123A456";
const reg = /\d+a/gi; // 數(shù)字無窮,a結(jié)尾,全局不區(qū)分大小寫
console.log(str.match(reg));
const str = "123abc456";
const str2 = "abc";
const arr = str.match(str2);
console.log(arr);
console.log(arr.index); // 出現(xiàn)的位置
console.log(arr.input); // 母字符串
1.3 貪婪匹配、非貪婪匹配
- 貪婪匹配:直接寫量詞就是貪婪,會從最高次開始匹配
- 非貪婪匹配:在量詞后面加?,從最少次次數(shù)開始匹配
const str = "AAaaaa123456";
// 貪婪匹配
const reg = /a{0,5}/gi;
// 非貪婪匹配
const reg2 = /a{1,10}?/gi;
console.log(str.match(reg));
// ["AAaaa", "a", "", "", "", "", "", "", ""]
console.log(str.match(reg2));
// ["A", "A", "a", "a", "a", "a"]
- 子集:() 子集(一個整體),被括號包裹起來的就是一個整體
- 或者:| 豎線
- 范圍詞:[] 有或者的意思
- 匹配漢字:\u4e00-\u9fa5
- \1:轉(zhuǎn)義1必須子集搭配使用
const str = "AB aabbba bb";
const reg1 = /ab+/gi;
const reg2 = /(ab)+/gi;
console.log(str.match(reg1)); // ["AB", "abbb"]
console.log(str.match(reg2)); // ["AB", "ab"]
const str = "abcdefAdsdbfgFH";
const reg = /a|b|g/gi;
const reg2 = /[a-z]/g;
console.log(str.match(reg)); // ["a", "b", "A", "b", "g"]
console.log(str.match(reg2)); // ["a", "b", "c", "d", "e", "f", "d", "s", "d", "b", "f", "g"]
const str = "魔道祖師 so nice";
const reg = /[\u4e00-\u9fa5]/g;
console.log(str.match(reg)); // ["魔", "道", "祖", "師"]
// replace()
const str = "魔道祖師有15集";
const reg = /\d+/g;
// replace()第二個參數(shù)字符串的寫法
console.log(str.replace(reg, "十五")); // 魔道祖師有十五集
// replace()第二個參數(shù)函數(shù)的寫法
console.log(str.replace(reg, function (){
return "十五";
})); // 魔道祖師有十五集
const str = "A1B2C3A1B2";
const reg = /(A1)|(B2)/g;
console.log(str.replace(reg, function (){
return "a1"; // 所有A1 B2的被替換成a1
})); // a1a1C3a1a1
// replace() 位置置換
const str = "伴她 小機器人 可樂";
const reg = /(伴她)\s(小機器人)\s(可樂)/
console.log(str.replace(reg, "$2 $3 $1")); // 小機器人 可樂 伴她
// $1代表第一個子集,$2代表第二個子集,以此類推
const str = "A1B2C3";
const reg = /(A1)/g;
console.log(str.replace(reg, function(a,b,c,d){
console.log(a); // 返回的是匹配成功的A1
console.log(b); // 返回的是子集里面的A1
console.log(c); // 下標(biāo)
console.log(d); // 源字符串
})); // A1 A1 0 A1B2C3
const str = "aaabbbcccdddeeefff";
const reg = /(\w)\1+/g;
// 貪婪匹配從最高次數(shù)匹配,子集轉(zhuǎn)義\w匹配到小寫字母,后面\1是轉(zhuǎn)義前面的\w轉(zhuǎn)義內(nèi)容重復(fù)就累加在后面
console.log(str.match(reg));//["aaa", "bbb", "ccc", "ddd", "eee", "fff"]
const str = "abc";
const reg = /\w/g;
console.log(reg.exec(str)); // ["a", index: 0, input: "abc", groups: undefined]
console.log(reg.exec(str)); // ["b", index: 1, input: "abc", groups: undefined]
console.log(reg.exec(str)); // ["c", index: 2, input: "abc", groups: undefined]
console.log(reg.exec(str)); // null