0 概述

0.1 正则概念

就是一个规则,用来处理字符串的一个规则


0.2 正则的用处

  1. 匹配:判断一个字符串是否包含我们所指定的规则 ref.test(str)
  2. 捕获:把字符串中符合规则的内容捕获到 ref.exec(str)

0.3 正则的元素

每一个正则表达式都是由元字符和修饰符组成的

  1. 【元字符】在//之间具有意义的一些字符
  2. 【量词元字符】代表出现次数数量的元字符
  3. 【特殊符号】((),[])
  4. 【修饰符】
    ① global(g):全局匹配
    ② ignoreCase(i):忽略大小写匹配
    ③ multiline(m):多行匹配

1 创建正则

我们可以先看看正则里都包含了哪些

console.log(RegExp.prototype);


1.1 字面量方式

var reg = /\d/


1.2实例创建

var reg = new RegExp(“”)


1.3两者区别

  1. 字面量:在字面量方式中,我们//之间包起来的所有内容都是元字符,有特殊意义的,大部分都是代表本身含义的普通的元字符
    1
    2
    3
    4
    var name = zhu;
    var reg = /^\d+"+name+"\d+$/g;
    Console.log(reg.test("2015zhu2016"))// false;
    Console.log(reg.test('2015""nameeeee2016'))// true;

在这段代码中,并非是name代表zhu而是仅代表name本身,并且+为出现e的次数


  1. 创建实例
    1
    2
    var reg = new RegExp("/^\\d+"+name+"\\d+$/",g);
    console.log(reg.test("2015zhu2016")) //true;

这里name就代表的是zhu
注意:

1.创建实例中转移符为两个\\d
2.创建实例中修饰符作为第二个参数传入


1.4 字符串match方法

字符串中的match方法:把所有和正则匹配的字符都获取到

1
2
3
4
var reg = /\d+?/g;
var str = "zhufeng2015peixun2016";
var ary = str.match(reg);
console.log(ary)

虽然当前情况下,match比我们的exec更加的简便一些,但是match中存在一些自己处理不了的问题:在分组捕获的情况下,match只能捕获到大正则匹配的内容,而对于小正则捕获的内容是无法获取的


1.5 字符串中replace

把原有的字符串替换成新的字符
在不使用正则的情况下,每当执行一次只能替换一个字符

1
2
3
var str = "zhufeng2015zhufeng2016"
str = str.replace("zhufeng","zhufengjiaoyu").replace("zhufeng","zhufengjiaoyu")
// "zhufengjiaoyujiaoyu2015zhufeng2016"

这样出现zhufengjiaoyujiaoyu并没有实现需求;

1
2
3
4
var str = "zhufeng2015zhufeng2016"
str = str.replace(/zhufeng/g,"zhufengjiaoyu");
console.log(str);
// "zhufengjiaoyu2015zhufengjiaoyu2016"

replace第一项的值是一个正则的实现原理

2 语法规则

2.1 元字符

在//之间具有意义的一些字符

\:转义字符,转义后面字符所代表的含义
^ :以某一元字符开始
$ :以某一元字符结束
\n :匹配一个换行符
. :除了\n以外的任意字符

1
2
3
4
5
6
var reg = /^0.2$/  // 以0开头2结尾中间除了\n的任意字符
Console.log(reg.test("0.2")) // true
Console.log(reg.test("0-2")) // true
reg = /^0\.2$/
Console.log(reg.test("0.2")) // false
Console.log(reg.test("0-2")) // true

x|y:x或y其中一个
[xyz]:x或者y或者z其中一个
[^xyz]:除了xyz之外的任意字符
[a-z]:a-z之间任意一个字符
[^a-z]:除了a-z之间任意一个字符
\d:一个0-9之间的数字
\D:除了0-9之外的任意字符
\w:数字,字母,下划线中的任意一个字符 [0-9a-zA-Z_]
\b:匹配一个边界符
\s:匹配一个空白字段,空格或制表符,换页符


2.2 量词元字符

代表出现次数数量的元字符

*:出现0到多次
+:出现1到
?:出现0或1次
{n}:出现n次
{n,}:出现n到多次
{n,m}:出现n到m次

一个简单的手机验证

1
var reg= /^1\d(10)$/


2.3 特殊符号

  1. ()
    分组作用改变x|y的优先级

    var reg = /^18|19$/;

可以是18,19,189,119,819,1819….

var reg = /^(18|19)$/;

只能是18,19

  1. []
    1) 在括号中出现的所有字段都代表本身意思的字符串(没有特殊含义)
    1
    2
    3
    var reg = /^0[.]$/  // 以0开头2结尾中间除了\n的任意字符
    console.log(reg.test("1")) // false
    console.log(reg.test(".")) // true

2) 中括号中不识别两位数

1
2
3
var reg = /^[12]$/  // 1或者2中的其中一个
var reg = /^[12-68]$/ // 1,2-6中的一个,8 三个中的一个
var reg = /^[\w-]$/ // 数字,字母,下划线,-中的一个


2.4 修饰符

修饰符可以有效的解决正则捕获的懒惰性

global(g):全局匹配
ignoreCase(i):忽略大小写匹配
multiline(m):多行匹配


3 正则用法

3.1 匹配

判断一个字符串是否包含我们所指定的规则

ref.test(str)

1
2
3
4
var reg = /\d/  //包含一个0-9之间的数字
console.log(reg.test("住")); //false
console.log(reg.test("1")); //true
console.log(reg.test("住111")); //true

3.2 捕获

把字符串中符合规则的内容捕获到

ref.exec(str)

1
2
3
var reg = /\d/;
console.log(reg.exec("住")); // null
console.log(reg.exec("1")); // ["1",index:0,input:"1"]

3.3 捕获的内容格式

第一项为当前数组最大正则捕获的内容

index:捕获内容所在开始索引位置
input:捕获的原始字符串

1
2
3
4
var reg = /\d+/;
var str = "zhufeng2015peixun2016";
var res = reg.exec(str);
console.log(res); //["2015",index:7,input:"zhufeng2015peixun2016"]


3.4 正则捕获的特点

1.懒惰型
每一次执行exec只捕捉第一个正则匹配的内容,在不进行任何处理的情况下,在执行多次捕捉,不做的还是第一个匹配内容
第一次:

1
2
3
4
var reg = /\d+/;
var str = "zhufeng2015peixun2016";
var res = reg.exec(str);
console.log(res); //["2015",index:7,input:"zhufeng2015peixun2016"]

第二次:还是一样

1
2
3
4
var reg = /\d+/;
var str = "zhufeng2015peixun2016";
var res = reg.exec(str);
console.log(res); //["2015",index:7,input:"zhufeng2015peixun2016"]

如何解决懒惰型: 在正则末尾加上一个修饰符g
原理:加了全局修饰符g,正则每一次捕获或,我们的lastIndex的值都变为了最新的值,下一次捕获从最新的位置开始查找。

1
2
3
4
5
6
7
var reg = /\d+/g;
var str = "zhufeng2015peixun2016";
var res = reg.exec(str);
console.log(reg.lastIndex); //匹配开始位置 0
console.log(res); //[“2015”,index:7,input:“zhufeng2015peixun2016”]
Console.log(reg.lastIndex); //匹配开始位置 11
console.log(res); //[“2016”,index:7,input:17“zhufeng2015peixun2016”]

捕获全部内容:

1
2
3
4
5
6
7
8
var reg = /\d+/g;
var str = "zhufeng2015peixun2016";
var arr = [];
while(res){
arr.push(res[0]);
res = reg.exec(str);
}
console.log(arr);

2.贪婪性
正则的每一次捕获都是按照匹配最长的结果捕获的例如:2符合正则2015也符合正则,我们默认捕获的是2015
如何解决贪婪性:在量词元字符后面加上?即可

1
2
3
4
5
6
7
8
var reg = /\d+?/g;
var str = "zhufeng2015peixun2016";
console.log(reg.exec(str)); //["2",....]
var ary = [],res = reg.exec(str);
while(res){
ary.push(res[0]);
}
console.log(ary);


4正则分组

4.1 分组引用

\2代表和第二个分组出现一模一样的内容;\1和第一个分组出现一模一样的内容:
一模一样:和对应的分组中的内容的值都要一样

1
2
3
var reg = /^(\w)\1(\w)\2$/;
Console.log(reg.test("zzff")); //true
Console.log(reg.test("z0f_")); //false

4.2 分组捕获

正则在捕获的时候,不仅仅把大正则匹配的内容捕获到,而且还可以把小分组匹配的内容捕获到

(?:)在分组中?:的意思是只匹配不捕获

1
2
3
4
var reg = /^(\d{2}(\d{4})(\d{4})(\d{2})(\d{2})(?:\d{2})(\d)(?:\d|X))$/ 
var str = "142726199009181211";
console.log(reg.exec(str));
// ary = ["142726199009181211", "142726199009181211", "2726", "1990", "09", "18", "1", index: 0, input: "142726199009181211", groups: undefined]

ary[0] 大写正则匹配的全部内容
ary[1] 第一个分组捕获的内容
ary[2] 第二个分组捕获的内容
Match捕获:

console.log(str.match(reg))

和exec获取的结果一样
不同:

1
2
3
4
5
var reg = /zhufeng(\d+)/g
var str = "zhufeng1234zhufeng3456zhufeng5678";
console.log(reg.exec(str)); //["zhufeng1234", "1234", index: 0, input: "zhufeng1234zhufeng3456zhufeng5678", groups: undefined]
console.log(reg.exec(str)); //["zhufeng3456", "3456", index: 11, input: "zhufeng1234zhufeng3456zhufeng5678", groups: undefined]
console.log(reg.exec(str)); //["zhufeng5678", "5678", index: 22, input: "zhufeng1234zhufeng3456zhufeng5678", groups: undefined]

而match只能捕获大正则匹配的内容

1
console.log(str.match(reg)) //["zhufeng1234", "zhufeng3456", "zhufeng5678"]


5 练习

1.有效数字的正则
1)”.”可以出现也可以不出现,一旦出现后面要跟着一位或多位数字
2)最开始可以使+/-也可以没有
3)整数部分,一位数可以使0-9之间的一个,多位数不能以0开头

1
var reg = /^[+-]?(\d|([1-9]\d+))(\.\d+)?$/

2.年龄介于18-65之间 18-19 20-59 60-65

1
var reg = /^[+-]?(\d|([1-9]\d+))(\.\d+)?$/

3.邮箱认证(简版)
左侧:数字,字母,下划线。。。

1
var reg = /^[\w.-]+@[0-9a-zA-Z]+(\.[a-zA-Z]{2,4})(1,2)$/;

4.中国标准实名2-4位

1
var reg = /^[\u4e00-\u9fa5]{2,4}$/

5.身份证号

1
2
3
var reg  = /^\d{17}(\d\X)$/
// 21 0302 1990 12 30 00 1 9
var reg = /^(\d{2}(\d{4})(\d{4})(\d{2})(\d{2})(\d{2})(\d)(\d|X))$/

最后更新: 2018年11月25日 17:24

原始链接: http://linjiad.github.io/2018/11/21/正则/

× 请我吃糖~
打赏二维码