一、正则是神魔?
简单来说正则就是用来处理字符串的一种规则;学习正则其实就是学习如何编写规则,每一个正则都是由“元字符”、“修饰符”两部分组成;
正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。
搜索模式可用于文本搜索和文本替换。
何为正则表达式?
- 正则表达式是由一个字符序列形成的搜索模式。
- 当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。
- 正则表达式可以是一个简单的字符,或一个更复杂的模式。
- 正则表达式可用于所有文本搜索和文本替换的操作。
神魔是正则的匹配和捕获?
1、正则匹配:验证当前字符串是否符合某个规则
1 var str = "a"
2 var reg = /\d/g;
3 console.log(reg.test(str));// false
2、正则捕获:把一个字符串中符合规则的字符获取到
var str = "zhuefeng2018peixun2019";
var reg = /\d+/;
console.log(reg.exec(str));//["2018", index: 8, input: "zhuefeng2018peixun2019", groups: undefined]
如何去创建正则?
let reg1 = /^\d+$/g;//=>字面量方式
let reg2 = new RegExp("^\\d+$","g");//=>构造函数方式
二、常用修饰符
可以叠加使用,无使用顺序
- i:ignoreCase 忽略大小写匹配
- m: multiline 多行匹配(忽略换行)
- g: global 全局匹配
三、常用元字符
1、特殊元字符
- \d 0~9之间的一个数字
- \D 非0~9之间的任意字符
- \w "数字、字母、下划线"中的任意一个; [0-9a-zA-Z_] 等价于\w
- \s 匹配任意一个空白字符(包括\t制表符【TAB键四个空格】)
- \b 匹配边界符'zhu'(z左边和u右边就是边界) 'zhu-feng'(z左边、u右边、f左边、g右边是边界)
- \n 匹配一个换行符
- \ 转义字符(把一个普通字符转义为特殊的字符,例如:\d,把有特殊含义的转换为普通意思)
- . 不仅仅是小数点,代表除了\n以外的任意字符
- ^ 以某个元字符开头
- $ 以某个元字符结尾
- x|y x或者y中的任意一个(a\z...)
- [xyz] x或者y或者z中的任意一个
- ^xyz] 除了x\y\z以外的任意字符
- [a-z] 获取a-z中的任意字符
- () 正则分组
- (?:) 当前分组只匹配不捕获
- (?=) 正向预查
- (?!) 负向预查
- [\u4e00-\u9fa5] 匹配汉字
- .........
2、量词元字符
[量词元字符:让其左边的元字符出现多少次]
- ? 出现零到一次
- * 出现零到多次
- + 出现一到多次
- {n} 出现n次
- {n,} 出现n到多次
- {n,m} 出现n到m次
3、普通元字符
只要是在正则中出现的元字符(在基于字面方式创建),除了有特殊和量词意义的以外,其余的都是普通元字符
4、中括号
中括号中出现多位数只要有一位满足要求即可;
1 var reg = /[1234]/;
2 console.log(reg.test("567891"));//true
3
4 var reg = /[1234]/;
5 console.log(reg.test("567879"));// false
在中括号中出现的元字符一般都代表本身含义;
1 let reg = /^.$/;//点的意思是除了换行符(\n)之外的所有字符
2 console.log(reg.test('n'));//=>true
3 console.log(reg.test('1'));//=>true
4 console.log(reg.test('nn'));//=>true
5 console.log(reg.test('\n'));//=>false
6
7 let reg = /^[.]+$/;
8 console.log(reg.test('n'));//=>false
9 console.log(reg.test('1'));//=>false
10 console.log(reg.test('nn'));//=>false
11 console.log(reg.test('\n'));//=>false
12 console.log(reg.test('...'));//=>true
13
14 let reg = /^[\d]+$/;//=>\d在这里依然是0~9中的一个数字
15 console.log(reg.test('0'));//=>true
16 console.log(reg.test('d'));//=>false
在中括号中^代表“除了”
1 var reg = /[d-z]/
2 var str ="b"
3 console.log(reg.test(str));// false
4
5 var reg = /[^d-z]/;//
6 var str ="666"
7 console.log(reg.test(str));//true
四、小括号的应用
1、改变默认优先级
1 var reg = /^12|34$/; //12开头或者34结尾
2 console.log(reg.test(8934));//true
3 console.log(reg.test(1278));//true
4 console.log(reg.test(454));//false
5 console.log(reg.test(131));//false
6
7 var reg = /^(12|34)$/; //12或者34
8 console.log(reg.test(12));//true
9 console.log(reg.test(34));//true
10 console.log(reg.test(3456));//false
11 console.log(reg.test(5634));//false
2、分组捕获
1 分组捕获身份证号
2 var reg = /^\d{17}(\d|x)$/;//简单匹配\d{17}代表的是0-9的数字出现17次;\d|X代表的是出现0-9其中一个数或者是X;加了小括号是为了增加权重。
3 var reg =/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{2})(\d)(\d|x)$/;//地域;出生年;月;日;男/女;随机数
4 console.log(reg.exec("150430199011052673"))
5 ["150430199011052673", "150430", "1990", "11", "05", "26", "7", "3", index: 0, input: "150430199011052673", groups: undefined]
3、分组引用
var reg = /^([a-z])([a-z])\2\1$/;//正则中出现的\1代表和第一个分组一模一样的内容
console.log(reg.test("oppo"));//true
console.log(reg.test("poop"));//Identifier 'reg' has already been declared
at <anonymous>:1:1
五、正则捕获
把一个字符串当中和正则匹配的部分获取到
正则:exec、test
字符串:replace、split、match...
1、基于Exec可以实现正则的捕获
1.如果当前正则和字符串不匹配,捕获的结果是null
2.如果匹配,捕获的结果是一个数组
-
0:大正则捕获的内容
-
index:正则捕获的起始索引
-
input:原始操作的字符串
3.执行一次exec只能捕获到第一个和正则匹配的内容,其余匹配的内容还没有捕获到,执行多次,并没有什么用
var str = "zhongguo5000jiayou2019";
var reg = /\d+/;
console.log(reg.exec(str));
//输出:["5000", index: 8, input: "zhongguo5000jiayou2019", groups: undefined]
var str = "qwertyuiasdfghjk";
var reg = /\d+/;
console.log(reg.exec(str));
//输出:null
2、正则捕获的懒惰性
var str = "zhongguo5000jiayou2019";
var reg = /\d+/;
console.log(reg.exec(str));
//输出:["5000", index: 8, input: "zhongguo5000jiayou2019", groups: undefined]
console.log(reg.exec(str));
//输出:["5000", index: 8, input: "zhongguo5000jiayou2019", groups: undefined]
console.log(reg.exec(str));
//输出:["5000", index: 8, input: "zhongguo5000jiayou2019", groups: undefined]
console.log(reg.exec(str));
//输出:["5000", index: 8, input: "zhongguo5000jiayou2019", groups: undefined]
上述代码只能捕获到第一个匹配的内容,剩余的默认捕获不到;解决正则的懒惰性,我们需要加全局修饰符g;
var str = "zhongguo5000jiayou2019";
var reg = /\d+/g;
console.log(reg.exec(str));
//输出:["5000", index: 8, input: "zhongguo5000jiayou2019", groups: undefined]
console.log(reg.exec(str));
//输出:["2019", index: 18, input: "zhongguo5000jiayou2019", groups: undefined]
console.log(reg.exec(str));
//输出:null
console.log(reg.exec(str));
//输出:["5000", index: 8, input: "zhongguo5000jiayou2019", groups: undefined]
上述代码添加全局修饰符g后下次匹配会从上次匹配内容的lastIndex找起;因为2019后面没有了所以返回null;
3、正则捕获的贪婪性
正则捕获具有贪婪性:每一次匹配捕获的时候,总是捕获到和正则匹配中最长的内容,例如:'2'符合\d+ '2018'也符合\d+,但是捕获的是最长的内容'2018'...
4、?在正则中的作用
1.量词元字符:出现零次或者一次
/-?/ 让减号出现一次或者不出现
2.取消贪婪性
/\d+?/捕获的时候只捕获最短匹配的内容
3.?:只匹配不不捕获
4.?= 正向预查
5.?! 负向预查
5、replace
replace也是一种实现正则捕获的方法;真实项目中的很多需求不基于正则都是无法替换的;
replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
语法
- string.replace(searchvalue,newvalue);
- searchvalue作为要被替换的内容的格式应该为正则形式;
- newvalue作为替换的内容应该是一个字符串值
- 返回值:一个新的字符串,原有字符串不会改变;
实例
var str="Mr Blue has a blue house and a blue car";
var n=str.replace(/blue/g,"red");
console.log(n);
//输出:Mr Blue has a red house and a red car
上述代码如果加上忽略大小写则会输出
//Mr red has a red house and a red car