一、正则是神魔?

简单来说正则就是用来处理字符串的一种规则;学习正则其实就是学习如何编写规则,每一个正则都是由“元字符”、“修饰符”两部分组成;

正则表达式(英语: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");//=>构造函数方式



二、常用修饰符

可以叠加使用,无使用顺序

  1. i:ignoreCase 忽略大小写匹配 
  2. m: multiline 多行匹配(忽略换行)
  3. 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