day-037-thirty-seven-20230328-正则基础-正则匹配
正则表达式
正则:RegExp,专门对字符串进行一系列验证和捕获操作。是JavaScript中11个引用数形之一。
正则的作用
- 匹配:验证一下(手机号、密码、身份证号…)格式是否正确
- 捕获:从一串字符串中获取想要的内容
正则语法
-
正则写法
-
构造函数法: new RegExp(元字符,修饰符);
-
字面量法: /元字符/修饰符
- 两个斜线又叫定界符,所以字面量法也叫定界符法。
- 字面量法一定要写内容
let reg = new RegExp();//构造函数法 console.dir(reg); let reg2 = /o/;//字面量法--->定界符法,字面量法一定要写内容。 //构造函数法: new RegExp(元字符,修饰符); //字面量法: /元字符/修饰符 let reg = new RegExp('w','i'); let reg2 = /w/i;
-
-
注意
- 对元字符需要区分大小写
- \d : 0-9随机1位数
- 元字符一般一定要有
- 修饰符可有可无
- 修饰符 i : 不区分大小写
- 对元字符需要区分大小写
let str = "hello Apple to you";
let reg1 = /apple/;
console.log([reg1], reg1.test(str));
let reg2 = /Apple/;
console.log([reg2], reg2.test(str));
let reg3 = /apple/i;
console.log([reg3], reg3.test(str));
let reg4 = new RegExp("apple");
console.log([reg4], reg4.test(str));
let reg5 = new RegExp("Apple");
console.log([reg5], reg5.test(str));
let reg6 = new RegExp("apple", "i");
console.log([reg6], reg6.test(str));
常用方法
正则对象方法
- 正则对象.test(字符串) 查看字符串是否匹配 成功true 失败false
字符串方法
- 字符串.match(正则对象) 把满足正则的内容,获取出来
- 默认情况下,只会捕获
满足正则条件的第一个
- 加上修饰符g,就会捕获
所有满足正则条件的每一个
- 加上修饰符g,就会捕获
- 默认情况下,只会捕获
构造函数法与字面量法区别
- 构造函数法 元字符可以使用变量,字面量法元字符无法使用变量
- 字符串中特殊字符需要转义(字符串的特色)
转义符\
- 字符串中没有
\
(单杠
)\\双杠
代表单杠字符串
的含义
- 字符串中没有
- 构造函数法如果遇到特殊字符,需要转义,前面多加\,变成多杠
let str = '8'
let reg1 = /\d/;// \d : 0-9随机一位数
console.log("reg1.test(str)--->", reg1.test(str))
let reg2 = new RegExp('\\d','');// \d : 0-9随机一位数
console.log("reg2.test(str)--->", reg2.test(str))
let str = "\"'\d";
let reg1 = /"/; //
console.log("reg1.test(str)--->", reg1.test(str));
let reg2 = new RegExp("\"'", ""); //
console.log("reg2.test(str)--->", reg2.test(str));
元字符
-
字符集
- 普通字符集-中括号[]相关
- [abc] : 匹配指定集合中的任意一个字符
- [^abc] : 不能匹配指定集合的任意一个字符
- [^xxx] : 除了xxx之外的任意内容
- [0-9] : 中括号里减号-表示连字符,用于表示从
连字符前的字符
到连字符后的字符
中间的字符编号
- [0-9] : 匹配0-9任意一个数字
- [a-z] : 匹配a-z任意一个小写字母
- [A-Z] : 匹配A-Z任意一个大写字母
- [A-z] : 匹配
A-Z
与a-z
与[
与\
与]
与^
与_
与` - [\u4e00-\u9fa5] 中文汉字 [一-龥]
- 特殊含义字符集-简写
\d
: 0-9随机一个数字\D
: 不能是数字\w
: 字母、数字、下划线\W
: 非 字母、数字、下划线\s
:匹配空格\S
: 匹配非空格.
:除回车(\r)和换行(\n)的任意内容- 元字符中
.
有特殊含义, 想要特殊含义消失,要用反斜线转义 —>\.
- 转义其实是让特殊字符变成普通字符的
- 元字符中
\b
匹配单词边界\B
匹配非单词边界
- 普通字符集-中括号[]相关
-
单词边界
-
概念
- 单词与符号之间的边界就叫单词边界,符号与单词之间才会有边界
- 单词与单词之间没单词边界
- 符号与符号之间没单词边界
- 单词:英文单词 英文字母 数字 [a-zA-Z0-9]
- 符号: [^a-zA-Z0-9] 字符串开头 字符串末尾
-
如:中文符号 英文符号 空格 制表符 换行 中文汉字 字符串开头 字符串末尾
-
单词左右什么都没有,也属于单词边界。即字符串开头与末尾也属于单词边界。
let str="hello"; let reg=/\bhello\b/; console.log(reg.test(str));
-
- 单词与符号之间的边界就叫单词边界,符号与单词之间才会有边界
-
单词边界与非单词边界并不占用字符数量
let str="我hello4"; let reg=/^\b(hello)\B$/; console.log(reg.test(str));//false let reg1=/^[^a-zA-Z0-9]{1}\b(hello)\B[a-zA-Z0-9]{1,}$/; console.log(reg1.test(str));//true
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-steSsD0o-1679997518730)(./单词边界示意图.png)]
-
-
数量词
- 普通数量词-花括号
{x}
出现x次{x,y}
出现x到y次{x,}
出现大于等于x次
- 简写
?
0次或1次*
0次或多次+
1次或多次
- 普通数量词-花括号
-
预查
-
(?=xxx)
后面必须紧邻xxx,正向预查let str="donot"; let reg=/do(?=not)/; console.log(reg.test(str));//true
-
(?=xxx)括号中的东西,不计入字符
let str = "donot"; let reg1 = /^do(?=not)$/; console.log(reg1.test(str)); //false let reg = /^do(?=not)[a-z]{3}$/; console.log(reg.test(str)); //true
-
-
(?!xxx)
后面不能紧邻xxx,负向预查let str="donot"; let reg=/do(?!not)/; console.log(reg.test(str));//false
- (?!xxx)括号中的东西,不计入字符
-
-
捕获与匹配
?:
只匹配不捕获
-
分组与选择
()
分组|
选择,或者
-
^
与$
相关^
: 以xxx开头$
: 以xxx结尾^xxx$
: 以xxx开头并且以xxx结尾- 中间的内容是几个内容,字符串也必须是几个内容,长度要一致
修饰符
- 修饰符
-
i : 不区分大小写
- 默认情况下
-
g : 全局匹配
-
默认情况下,只会捕获 满足正则条件的第一个。加了g,会捕获 所有的满足正则条件的每一个
{ let str="Hello One two one three ONE"; let reg=/one/i; console.log(str.match(reg));//['One', index: 6, input: 'Hello One two one three ONE', groups: undefined] } { let str="Hello One two one three ONE"; let reg=/one/ig; console.log(str.match(reg));//['One', 'one', 'ONE'] }
-
-
m : 多行匹配
-
默认情况下,字符串只有末尾才算是一个结尾。加了m,一个换行\n或字符串末尾就算一个结尾。
{ let str="Hello One\n two a\n one three ONE"; console.log(str); let reg=/a$/;//false console.log(reg.test(str)); } { let str="Hello One\n two a\n one three ONE"; console.log(str); let reg=/a$/m;//true console.log(reg.test(str)); }
-
-
练习题
//1. 验证一个字符串 是否以 http:// https:// 开头
// let str="https://www.baidu.com"
// let reg=/^http(s)?:\/\//;
// console.log(reg.test(str));
//2.手机号 11位 开头1
// let str="16619816985";
// //let reg=/^1[3-9]\d{9}$/;
// let reg=/^(\+86|0086)?1[3-9]\d{9}$/;
// console.log(reg.test(str));
// 3.身份证 18位 最后1位 X x 数字
// 15位
// let str='130828199312080617';
// let reg=/^\d{15}(\d{2}[0-9Xx])?$/;
// console.log(reg.test(str));
//4.中文姓名 \u4e00-\u9fa5 迪丽·热巴
// let str="迪丽·热巴"
// let reg=/^[\u4e00-\u9fa5]{2,}(·[\u4e00-\u9fa5]{2,})?$/;
// console.log(reg.test(str));
//5. 数字、字母、下划线 6-16位
// let reg=/^\w{6,16}$/;
//6. 13-65
// 13-19 1[3-9]
// 20-29 2[0-9]
// 30-39 3[0-9]
// 40-49 4[0-9]
// 50-59 5[0-9] [2-5]\d
// 60-65 6[0-5]
let str="33";
let reg=/^(1[3-9]|[2-5]\d|6[0-5])$/
//let reg=/^[13-65]$/;// 1 3-6 5
console.log(reg.test(str));
正则插件
- vscode插件 any-rule
- 搜索any-rule,下载并安装
- ctrl+shift+p,搜索正则大全并点击
- 搜索想要正则,就会插入想要的正则
正则属性
私有属性
- 私有属性–通过实例来访问
- global:是否是全局匹配,是否添加修饰符g true/false
- ignoreCase:否是不区分大小写,是否添加修饰符i true/false
- multiline:是否是多行匹配,是否添加修饰符m true/false
- source: 正则“元字符内容的字符串”写法
- lastIndex: 开始匹配的位置 或 下次开始匹配的位置
静态属性
静态属性–通过构造函数来访问
- $1–>$9
- $1 匹配成功的第一个小括号里面的值,默认空字符串
- $2 匹配成功的第2个小括号里面的值,默认空字符串
- …
- $9 匹配成功的第9个小括号里面的值,默认空字符串
公有方法
公有属性–通过实例来访问
- test() : 是否匹配成功 成功true 失败 false 会修改lastIndex的值
- exec() :捕获,每调用一次,就会捕获一个,返回的都是数组 0:捕获值 1:$1 2:$2
- 会修改lastIndex的值
- compile():加快编译的速度(了解)
let str="aaa apple Apple APPLE"
let reg=/apple/ig;
//console.dir(reg)
console.dir(RegExp)
do{
console.log(reg.lastIndex);//0 9 15 21
}while(reg.test(str))// test() 会修改lastIndex的值
例子
let str=new String("123");
console.dir(str);
// let str="1a2c aaa"
// let reg=/1(a|b)2(c|d)/ig;
// let res=reg.exec(str);
// console.log(res);//[1a2c.....]
// console.log(res[1]);
// console.log(reg.exec(str));//null
// let str="aaa apple Apple APPLE"
// let reg=/apple/ig;
// console.dir(reg)
// console.log(reg.exec(str));//apple
// console.log(reg.exec(str));//Apple
// console.log(reg.exec(str));//APPLE
// console.log(reg.exec(str));//null
// let str="1a2c"
// let reg=/1(a|b)2(c|d)/ig;
// console.log(reg.test(str));
// console.dir(RegExp);
// console.dir(RegExp.$1);
// //捕获
let str="aaa apple Apple APPLE"
let reg=/apple/ig;
//console.dir(reg)
console.dir(RegExp)
do{
console.log(reg.lastIndex);//0 9 15 21
}while(reg.test(str))// test() 会修改lastIndex的值