第二十七章.正则表达式一
一.正则表达式
正则表达式是一个查找和替换字符串的强有力的工具。
在 JavaScript 中,正则表达式通过内置的“RegExp”类的对象来实现,并与字符串集成。
-
例子
常规写法:
//提取出str中所有的数字组成一个数组 ["188","38","3","29"]
let str = "特务兔187伟哥38小希3薄荷29";
function fn( str ){
let arr = [];
let s = "";
for (let i=0;i<str.length;i++){
let thisChar = str[i];
if (isNaN(thisChar)) {
s && arr.push(s);
s = "";
}else{
s += thisChar;
}
}
s && arr.push(s);
return arr;
}
console.log(fn(str));
正则写法:
let str = "特务兔187伟哥38小希3薄荷29";
function fn(str){
return str.match(/\d+/g);
}
console.log(fn(str));
- 如何定义一个表达式
let s = "外经贸abc薄荷er";
let r = /abc/;
/*正则要结合一些方法来使用
*
* reg.test(str)
* 检测str中有没有reg规则,有返回true,没有则返回false
* */
console.log( r.test(s) );//true
let s = "外经贸abc薄荷er";
// let r = /x/;
//如果要根据某个字符串变量来制定正则规则
let x = "abc";
let r = new RegExp(x);
console.log( r.test(s) );//true
- 转义
/*
* 转义:
* 1.特殊符号需要转义
*
* 2.和特殊的字符结合有特殊的意义
* \d 数字
* \D 非数字
*
* \s 空格
* \S 非空格
*
* \w 字符(字母、数字、下划线)
* \W 非字符
*
* \b 单词边界(起始位置、结束位置、所有的非字符也就是\W)
* \B 非单词边界
* */
let str1 = "好好学习,天天向上!";
let str2 = 123456;
let reg1 = /\d/;
let reg2 = /\D/;
console.log(reg1.test(str));//false \d 匹配数字
console.log(reg1.test(str2));//ture
console.log(reg2.test(str));//true \D 匹配非数字
let str1 = "好好学习, 天天向上!";
let str2 = " ";
let reg1 = /\s/;
let reg2 = /\S/;
console.log(reg1.test(str1));//true \s 匹配空格
console.log(reg2.test(str1));//true \S 匹配非空格
console.log(reg2.test(str2));//false 转义\S为fasle情况的只有字符串全是空格的情况
let str = "一块五花肉花一块五, abc_123";
let reg1 = /\w/;
let reg2 = /\W/;
console.log(reg1.test(str));//true \w 字符(字母、数字、下划线)
console.log(reg1.test(str));//false
let str1 = 'Bob is a student.';
let str2 = 'Bobby is a student.';
let reg1 = /Bob/;
let reg2 = /\bBob\b/;
console.log(reg1.test(str1));//true
console.log(reg1.test(str2));//true 但是只想匹配的是Bobby
console.log(reg2.test(str2));//false \b 匹配边界
/*
*注意所有的汉字都是边界词
*/
- 量词
/*
* 量词
* {n} n个
* {n,m} 最少n个,最多m个
* {n,} 最少n个,最大无限制
*
* 特殊量词
* {1,} +
* {0,1} ?
* {0,} *
*
* 贪婪与惰性
* 默认贪婪
* 量词加? 变成惰性
* */
let str = "18327604423";
//let reg = /\d\d\d\d\d\d\d\d\d\d\d/; //这样写很烦,人都写傻了
let reg = /\d{11}/;
let reg2 = /\d{4,}?/;
let reg3 = /\d+?/;
/*
* str.match(reg)
* 匹配成功返回一个数据,匹配失败返回null
* */
console.log( str.match(reg) );//["18327604423", index: 0, input: "18327604423", groups: undefined]
console.log( str.match(reg2) );//["1832", index: 0, input: "18327604423", groups: undefined]
console.log( str.match(reg3) );//["1", index: 0, input: "18327604423", groups: undefined]
let str1 = "皮卡卡同学"; //皮卡卡叠词情况
let str2 = "皮卡同学";
let reg = /皮卡同学/;
console.log(str1.match(reg)); //null
console.log(str2.match(reg)); //["皮卡同学", index: 0, input: "皮卡同学", groups: undefined]
/*
* 贪婪与惰性
* 默认贪婪
* 量词加? 变成惰性
* */
let str = "Sherry酱是一个美女";
let reg1 = /Sheey是个美女/;//null
let reg2 = /Sherry酱?是一个美女/; // 量词?针对前面一个规则生效,“酱”
let reg3 = /Sherry酱?/;
let reg4 = /Sherry酱??/;//惰性匹配 Sherry
console.log(str.match(reg1));//null
console.log(str.match(reg2)); //["Sherry酱是一个美女", index: 0, input: "Sherry酱是一个美女", groups: undefined]
console.log(str.match(reg3)); //["Sherry酱", index: 0, input: "Sherry酱是一个美女", groups: undefined]
console.log(str.match(reg4)); //["Sherry", index: 0, input: "Sherry酱是一个美女", groups: undefined]
- 修饰词
/*
修饰词
* i 不区分大小写
* g 全局匹配
*
* m 换行匹配
*
* */
let str1 = "abc";
let reg = /ABC/;
let reg1 = /Abc/i; //不区分大小写
let reg2 = new RegExp("Abc","i");//第二种写法
console.log(reg.test(str));//false
console.log(reg1.test(str));//true
console.log(reg2.test(str));//true
let str = "皮卡:123456,阿远:7654321,小希:897897";
let reg = /\d+/;
console.log(str.match(reg));
//["123456", index: 3, input: "皮卡:123456,阿远:7654321,小希:897897", groups: undefined]
//match方法的特点成功匹配到到就结束了
//匹配所有的
let reg2 = /\d+/g;//全局匹配
console.log(str.match(reg2));// ["123456", "7654321", "897897"]
- 子项
/*
* 子项
* ()
*
* */
let str = "abcabcabcabcabcabcabcasdasdasdasd"
let reg1 = /(abc)+/;
console.log(str.match(reg1));
/*
["abcabcabcabcabcabcabc", "abc", index: 0, input: "abcabcabcabcabcabcabcasdasdasdasd", groups: undefined]
*/
let reg2 = /(abc)+(asd)+/;
console.log(str.match(reg2));//match方法,匹配会显示子项,如图所示
/*
["abcabcabcabcabcabcabcasdasdasdasd", "abc", "asd", index: 0, input: "abcabcabcabcabcabcabcasdasdasdasd", groups: undefined]
*/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2FClFAye-1615990911655)(C:/Users/%E7%AB%B9%E9%9D%92%E6%9A%AE%E9%9B%A8/AppData/Roaming/Typora/typora-user-images/1592114976945.png)]
//注意:若是全局匹配
let reg3 = /(abc)+(asd)+/g;//全局匹配,就不会显示子项了,只显示匹配结果
console.log(str.match(reg2));//如图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MtSbnLlO-1615990911660)(C:/Users/%E7%AB%B9%E9%9D%92%E6%9A%AE%E9%9B%A8/AppData/Roaming/Typora/typora-user-images/1592115220126.png)]
//最近一次子项匹配结果会存储到RegExp里面
console.dir(RegExp.$1);//abc
console.dir(RegExp.$2);//asd
- 字符集
/*
* 字符集
* []
*
* 1.或者的意思
* 2. -写法
*
* 很多在外面有特殊意义的字符在 [] 中是没有特殊意义的
* 在 [] 中有特殊意义的有 - \
*
* 汉字范围
* [\u4e00-\u9fa5]
*
*
* */
let str1 = "a皮卡";
let str2 = "b皮卡";
let str3 = "c皮卡";
let reg = /[abc]皮卡/;
console.log(str1.match(reg));//["a皮卡", index: 0, input: "a皮卡", groups: undefined]
console.log(str2.match(reg));//["b皮卡", index: 0, input: "a皮卡", groups: undefined]
console.log(str3.match(reg));//["c皮卡", index: 0, input: "a皮卡", groups: undefined]
let str = '7';
let reg = /[2-7]/;//匹配[2,7]之间
console.log(str.match(reg));//["7", index: 0, input: "7", groups: undefined]
let str = "gsahduiAAAdsakdDDDsds";
let reg = /[f-kA-Z]+/g;
console.log(str.match(reg));//["g", "h", "iAAA", "k", "DDD"]
let str = "(";
let reg = /[(/]/;
console.log(str.match(reg));//["(", index: 0, input: "(", groups: undefined]
let str = '#皮卡';
let reg = /[^0-9a-zA-Z]皮卡/;
console.log(str.match(reg));//["#皮卡", index: 0, input: "#皮卡", groups: undefined]