正则详解一

作者:日期:2018-03-31 20:40:31 点击:423

正则

 

什么是正则?

正则就是一个规矩,用来处理字符串的规矩
1¶••⊿正则匹配
编写一个规矩,验证某个字符串是否符合这个规矩,正则匹配应用的是 test 方法

2¶••⊿正则捕获
编写一个规矩,在一个字符串中把符合规矩的内容都获取到,正则捕获应用的方法:正则的exec方法¶••⊿字符串中的split¶••⊿replace¶••⊿match等方法都支撑正则

1.var reg = /^$/; //=>两个斜杠中间包含一些内容就是正则,两个斜杠之间包含的全部内容都是元字符

正则的元字符和润饰符

任何一个正则都是由 元字符 和 润饰符 组成的

润饰符
g(global):全局匹配
i(ignoreCase):疏忽大小写匹配
m(multiline):多行匹配

元字符
[量词元字符]
+:让前面的元字符涌现一到多次
?:涌现零到一次
*:涌现零到多次
{n}:涌现n次
{n,}:涌现n到多次
{n,m}:涌现n到m次

[特别意义的元字符]
\:转义字符(把一个普通字符转变为有特别意义的字符,或者把一个有意义字符转换为普通的字符)
.:除了\n(换行符)以外的任意字符
\d:匹配一个0~9之间的数字
\D:匹配任意一个非0~9之间的数字(大写字母和小写字母的组合正好是反向的)
\w:匹配一个 0~9或字母或_ 之间的字符
\s:匹配一个任意空白字符
\b:匹配一个边界符
x|y:匹配x或者y中的一个
[a-z]:匹配a-z中的任意一个字符
[^a-z]:和上面的相反,匹配任意一个非a-z的字符
[xyz]:匹配x或者y或者z中的一个字符
[^xyz]:匹配除了xyz以外的任意字符
():正则的小分组,匹配一个小分组(小分组可以懂得为大正则中的一个小正则)
^:以某一个元字符开端
$:以某一个元字符结束
?::只匹配不捕获
?=:正向预查
?!:负向预查
……

除了以上特别元字符和量词元字符,其余的都叫做普通元字符:代表本身意义的元字符

元字符详细解读

^ $

1.var reg = /\d+/; //=>包含某某某即可,这里阐明包含1到多个数字即可
2.var str = '珠峰2017培训2018';
3••。reg.test(str) =>true
4.
5.reg=/^\d+/;
6••。reg.test(str) =>false
7••。
8.reg=/^\d+$/;//=>只能是某某某的,这里阐明只能是1到多个数字
9.reg.test('2017'); =>true
10.reg.test('2017珠峰2018'); =>false
11.reg.test('2'); =>true ^或者$只是一个润饰或者声明,不会盘踞字符串的地位

\

1.var reg = /^2••。3$/;
2••。reg.test('2••。3'); =>true
3.reg.test('2+3'); =>true 点在正则中的意思:匹配除了\n以外的任意字符,而不是单纯的小数点
4.
5.reg = /^2\.3$/;
6.reg.test('2.3'); =>true
7.reg.test('2+3'); =>false 应用转义字符把点转换为本身小数点的意思

x|y

1.var reg = /^18|19$/;//=>18 19 189 119 819 181 1819 ... 很多都符合这个规矩
2./*
3••。 * 18或者19
4. * 以1开头 以9结尾 中间是8或者1
5••。 * 以18开头或者以19结尾即可 =>'18珠峰' '珠峰19'...
6. */
7••。
8.var reg = /^(18|19)$/;//=>此时只有18或者19符合我们的规矩了

():正则中的分组,也可以懂得为一个大正则中的一个正则(包起来的部分是一个整体);在正则中我们可以应用小括号转变一些默认的优先级

小分组还有第二个作用:分组引用
小分组的第三个作用:分组捕获

1.//=>分组引用:\1 或者 \2 ...涌现和第N个分组一模一样的内容
2.var reg = /^([a-z])([a-z])\2([a-z])$/; //=> 符合的字符串:foot¶••⊿book¶••⊿week¶••⊿attr¶••⊿http••。••。••。

[]

[xyz] [^xyz] [a-z] [^a-z]

1.//=>\w:数组字母下划线中的任意一个字符
2.var reg = /^[a-zA-Z0-9_]$/; //=>等价于\w
3.
4.//=>中括号中涌现的元字符,一般都代表本身的含义
5••。var reg = /^[.?+&]+$/; //=>里面的四个元字符都是本身含义,例如:点就是小数点了,不是所谓的任意字符••。••。••。
6.
7••。//=>需求:描写样式类名的规矩(数字¶••⊿字母¶••⊿下划线¶••⊿-),并且不能以-开头
8.//var reg = /^[\w-]+$/;
9••。//var reg = /^[0-9a-zA-Z_-]+$/; //=>没有处理以-开头的情况
10••。var reg = /^\w[\w-]*$/;
1.//=>需求:验证18~65之间的年纪
2.//var reg = /^[18-65]$/; //=>1或者8~6或者5中的任意一个字符,中括号中涌现的18不是数字18,而是1或者8,当前正则是非法的:因为不能设置8~6这种领域
3.
4.//=>分三个阶段处理:
5.// 18 或者 19 /(18|19)/
6.// 20 ~ 59 /([2-5]\d)/
7••。// 60 ~ 65 /(6[0-5])/
8.var reg = /^((18|19)|([2-5]\d)|(6[0-5]))$/;

常用的正则表达式编写

验证是否为有效数字

1./*
2. * 可能是正数,可能是负数 12 -12
3. * 整数或者小数 0 12 0.2 12.5 -12.3
4. * 只要涌现小数点,后面至少要跟一位数字
5••。 * 小数点前面必须有数字
6. */
7••。var reg = /^-?(\d|([1-9]\d+))(\••。\d+)?$/;
8./*
9••。 * -? 负号可有可无
10••。 * (\d|([1-9]\d+))
11. * \d 一位数可以是任何值
12••。 * ([1-9]\d+) 多位数不能以零开头
13. * (\.\d+)? 小数部分可有可无,有的话点后面必须跟一位数字
14. */

手机号码

1./*
2. * 11位数字
3. * 1开头
4••。 */
5.var reg = /^1\d{10}$/;

用户名:真实姓名

1.//=>/^[\u4E00-\u9FA5]$/ 中文汉字的正则
2.var reg = /^[\u4E00-\u9FA5]{2,10}(·[\u4E00-\u9FA5]{2,10})?$/;

邮箱

1••。var reg = /^\w+((-\w+)|(\.\w+))*@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
2••。/*
3. * 以数字字母下划线开头
4••。 * @前面可以是 数字¶••⊿字母¶••⊿下划线¶••⊿-¶••⊿. 这些符号
5. * 不能把 -和. 持续涌现,涌现一次后面必须跟数字字母下划线
6. *
7. * @后面的部分支撑
8. * 企业邮箱
9••。 * .com.cn 多域名情况
10••。 */
11••。// [A-Za-z0-9]+
12.// ((\.|-)[A-Za-z0-9]+)*
13.// \.[A-Za-z0-9]+
14.// @163.com.cn
15.// @zhu-feng-pei-xun.com.cn

身份证号码

1./*
2••。 * 18位
3••。 * 前17位必须是数字
4. * 最后一位可以是数字或者X(X代表数字10)
5. *
6. * 130828199012040617
7. * 前六位:省市县 130828
8••。 * 接下来八位 出身年+月+日
9. * 倒数第二位数字 奇数代表男 偶数代表女
10••。 */
11.var reg = /^(\d{6})(\d{4})(\d{2})(\d{2})\d{2}(\d)(\d|X)$/;
12••。//=>这样写不仅可以匹配,而且以后捕获的时候,不仅可以把大正则匹配的成果捕获到,里面每一个小分组(小正则)匹配的成果也可以单独的捕获到 “分组捕获”
13••。
14••。//=>年 1950~2017
15.//=>第一段 1950~1999
16.//=>第二段 2000~2017
17.//==> 00~09
18••。//==> 10~17
19.// /^((19[5-9]\d)|(20((0\d)|(1[0-7]))))$/

正则捕获

把当前字符串中符合正则的字符捕获到
RegExp.prototype:exec 实现正则捕获的方法

1.var str = '珠峰培训2017扬帆起航2018';
2.var reg = /\d+/;
3••。
4••。reg.exec(str);
5••。/*
6••。 * 当正则捕获的时候:
7. * 1¶••⊿先去验证当前字符串和正则是否匹配,如果不匹配返回的成果是null(没有捕获到任何的内容)
8. * 2¶••⊿如果匹配,从字符串最左边开端,向右查找到匹配的内容,并且把匹配的内容返回
9. *
10. * exec捕获到成果的格式:
11. * -> 获取的成果是一个数组
12••。 * -> 数组中的第一项是当前本次大正则在字符串中匹配到的成果
13••。 * -> index:记载了当前本次捕获到成果的起始索引
14••。 * -> input:当前正则操作的原始字符串
15. * -> 如果当前正则中有分组,获取的数组中,从第二项开端都是每个小分组,本次匹配到的成果(通过exec可以把分组中的内容捕获到)
16. *
17. * 履行一次exec只能把符合正则规矩条件中的一个内容捕获都,如果还有其它符合规矩的,需要在次履行exec才有可能捕获到
18. */

正则捕获存在怠惰性

履行一次exec捕获到第一个符合规矩的内容,第二次履行exec,捕获到的依然是第一个匹配的内容,后面匹配的内容不管履行多少次exec都无法捕获到

解决正则捕获的怠惰性:
在正则的末尾加润饰符g(全局匹配)

1.//=>正则为什么会存在怠惰性?
2./*
3. * 正则本身有一个属性:lastIndex(下一次正则在字符串中匹配查找的开端索引)
4. * 默认值:0,从字符串第一个字符开端查找匹配的内容
5. * 默认不管指定多少遍exec方法,正则的lastIndex值都不会变(也就是第二次以后查找的时候还是从第一个字符找,所以找到的成果永远都是第一个匹配的内容)
6••。 * 而且当我们手动把 lastIndex 进行修正的时候,不会起到任何的作用
7.*/
8.
9••。//=>为什么加润饰符g就解决了怠惰性?
10••。/*
11. * 加了润饰符g,每一次exec结束后,浏览器默认会把lastIndex值进行修正,下一次从上一次结束的地位开端查找,所以可以得到后面匹配的内容了
12••。 */
13.
14••。var reg = /\d+/g;
15••。var str = '珠峰培训2017杨帆起航2018';
16.console.log(reg.lastIndex);//=>0
17.console.log(reg.exec(str)[0]);//=>'2017'
18••。console.log(reg.lastIndex);//=>8
19••。console.log(reg.exec(str)[0]);//=>'2018'
20.console.log(reg.lastIndex);//=>16
21.console.log(reg.exec(str));//=>null
22.console.log(reg.lastIndex);//=>0
23••。console.log(reg.exec(str)[0]);//=>'2017'

上一篇: JS中的 变量提升¶••⊿作用域¶••⊿闭包 核心原懂得读

下一篇: git 基础知识精讲

秒速时时彩如何购买 PK10牛牛开奖直播 秒速时时彩开奖 鸿途彩票官网 极速赛车玩法 红宝石彩票手机app 鸿途彩票官网 网易彩票开奖走势图 75秒赛车网上购买 秒速时时彩投注平台