正则! 正则! 正则!

正则就是用来处理复杂的字符串

1.匹配字符串中的格式是否正确 -->正则的匹配 test(返回true/false)
2.把匹配的内容找出来 -->正则的捕获 exec (返回数组[ ])

匹配例子:
var reg=/mengqian/g;
1.写在'/ /'里面的都是元字符(必须要有)
2.写在/ /"*"后面的叫做修饰符(可以没有),只有三种"g(全局范围匹配),i(忽略大小写),m(换行匹配)"
具有特殊意义的元字符
 "\" :转译符 -->把有特殊意义的字符转为本来的意思
 var s='I\'m a person' 转译了\后面的' 只是一个单引号
-------------------------------------------------
" ^ " 以指定字符为开头 
var reg=/^1/  匹配以1开头的字符串
console.log(reg.test("12abc")) //true
console.log(reg.test("abc12")) //false
-------------------------------------------------
"$" 以指定字符结尾
var reg=/78$/;匹配以78结尾的字符串
console.log(reg.test("123478"));//true
如果是规定了开头跟结尾,中间内容就定死了
如: var reg=/^6abc7$/
console.log(reg.test("6abc7"));//false
var reg=/^\d$/; 匹配一个字符串只允许出现一位数字
-------------------------------------------------
"\d" 0-9中的任何一个数字
"\D" 除了0-9以外的任意一个字符
"\w" 匹配包括0-9,a-z,A-Z,_下划线 一共63个,这63个中的任意一个
"\W" 匹配除了"\w"匹配内容意外的所有字符
"\n" 匹配一个换行符"\n" //自己匹配自己.....晕
"\s" 匹配空白符 (如空格)
"\S" 匹配空白符以外的所有字符
"\b" 匹配一个边界 举例:⤵️
     注意!边界字符不能出现在中间
     console.log(/\ba/.test("ab"));//true
                (/\ba/.test("bbba"));//false
                (/\ba/.test("bbb a")/);//true
                (/\ba\b/.test("bbb a bbb"))//true
           
"\B" 匹配一个不是边界的字符 举例:⤵️
console.log(/\Bb/.test("ba"));//false
           (/\Bbb/.test("abb"))://true

===========================

量词元字符

"*" 表示前面的元字符出现0到多次

var reg=/\d\.*/; 该正则表示匹配包含数字和0到多个"."的字符串

"+"表示前面的元字符出现1到多次

var reg=/^.+\d/;该正则表示匹配开头以一个或多个不是换行符的和任意数字的字符串

"?"表示前面的元字符出现0次或1次

var reg=/^\d+\.?/ 该正则表示匹配以以一个或多个数字为开头,包含一个或0个"."的字符串
var reg=/\*+\+?/ 该正则表示匹配

"{n}"前面的元字符就出现n次

/^\d{3}$/;表示只匹配3个数字

"{n,}"前面的元字符就出现n到多次

"{n,m}"前面的元字符就出现n到m次

===============================================

"|"和"[ ]"的问题

x|y 表示x或y中的一个

两个二选一
var reg=/^(0|1)$/;只匹配"1"或者"0" 只允许一个数为开头和结尾
[xy] 表示从x,y中选一个,

在中括号中出现的所有的字符都是代表本身意思的字符(没有特殊的含义),中括号中不识别两位数

[abcde] 表示从abcde五个中选一个
[^xy] 表示只要不是x,y的字符就可以
[a-z] 表示a-z中的一个

思考:表示匹配a-z加上A-Z中的一个[a-zA-Z]
注意![]里面除了有特殊意义的字符(^(不包括or取反) -(至) \(转译))其他都是普通元字符的意义,例如[.]就表示点
比较"x|y"和"[xy]"的区别
/^10|89$/ //表示匹配以10开头或者89结尾的字符串
/^[1089]$/ //表示匹配从1,0,8,9 四个数里面选一个作为开头和结尾
/^[10-89]$/ //表示匹配从1,0-8,9 三个数里面选一个作为开头和结尾
报错:/^[17-59]$/ 不能从7-5 所以报错

==============================================

正则创建方式

1.字面量方式
var reg=/\d/;
2.构造函数方式
var reg=new RegExp("\\d")
(1)用构造函数方式创建的时候遇到""要换成"\ "一个斜杠换成两个
(2)构造函数方式可以实现变量拼接

例子:⤵️
var num=2017;
var str="zhufeng*2017*peixun";
var reg=/^[a-z]+\*\d{4}\*[a-z]+$/;

字面量创建和构造函数创建的区别

1.在字面量方式中,我们用双斜杠包起来的说有的内容都是元字符,有的具有特殊意义,大部分都是代表本身含义的普通元字符`字面量创建方式无法完成正则对变量的拼接.
2.字面量方式中出现的一切都是元字符,所以不能进行变量的拼接,而实例创建是可以的
3.字面量方式中直接写\d就可以,但在实例创建中需要把转译要写成双斜杠'  \d'才可以

思考:

1.匹配小数
2.匹配有效数字

/^(\.*\d+)|()/

=-=-=-=-=-=-=-=-=-=-=-=-=-=

正则的捕获exec

分为两个阶段
1.匹配,判断字符串是否匹配正则,不匹配返回null
2.捕获,把正则匹配的字符串的内容捕获出来,返回到一个数组里面
[数组的第一项:"捕获的内容",index:捕获内容在字符串的索引,input:原字符串]

例子⤵️

var str="abcdefg";
var reg=/\d/;
console.log(reg.exec(str));null
var str="2017nian5yue4hao"
console.log(reg.exec(str));
返回:["2", index: 0, input: "2017nian5yue4hao"]

正则的懒惰性:

捕获的时候只捕获第一个匹配的内容,正则中有一个属性叫lastIndex表示开始查找的位置


解决懒惰性,加上修饰符"g"就搞定

例子⤵️

var reg=/\d+/g;
var str="2017nian5yue4hao"
console.log(reg.exec(str));
//返回["2017", index: 0, input: "2017nian5yue4hao"]
console.log(reg.exec(str));
//返回["5", index: 8, input: "2017nian5yue4hao"]
console.log(reg.exec(str));
//返回["4", index: 12, input: "2017nian5yue4hao"]
console.log(reg.exec(str));
//null
这样可以多次捕获
原理:加了全局修饰符g,正则每一次捕获后,我们的lastIndex的值都会变为最新的值,下一次就从最新的位置开始查找,这样就可以把所有需要捕获的内容都捕获到了

但每次都值返回一个捕获值 如果想一次获取到所有匹配值可以使用while循环方法

看下面⬇️⬇️⬇️
var reg =/\d+/g;//获取所有数字的正则
var str ="zhufeng2015peixun2016ayangfan2017";
var ary = [];//首先建立一个空数组
var res = reg.exec(str);//建立正则捕获str
while(res){循环所有的正则捕获值只要不为空就一直循环捕获
ary.push(res[0]);将查找到的推加到建立的数组中去
res=reg.exec(str)只要不为空就再捕获一次
}
console.log(ary)//返回["2015", "2016", "2017"]

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

match方法

match本是字符串的方法 str.match(正则表达式)
注意:用match的时候 正则表达式必须加上修饰符g,否则就跟exec的结果一样了
match 返回是一个数组,但没有index和input这俩属性

例子⤵️

var str="es6css3h5";
var reg=/\d/g;//或者var reg=/\d+?/g;
console.log(reg.exec(str));
//["6", index: 2, input: "es6css3h5"]
console.log(str.match(reg));
//["6", "3", "5"]

虽然在当前的情况下match比我们的exec更加的简洁一些,但是match中也存在一些解决不了的问题:在分组捕获时只能捕获到大正则匹配的内容,而对小正则捕获的内容是无法获取的,
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

分组捕获

`正则再补货的时候,不仅仅把大正则比配的内容捕获到,而且还可以把小分组匹配的内容捕获到
正则分组:
1.改变优先级
2.分组引用:
\2代表和和第二个分组正则出现一模一样的内容;\1则代表和第一个分组出现一模一样的内容
exec返回值是个数组
1.第一项:大正则捕获的内容
2.第二项:第一个分组捕获的内容
3.第三项:第二个分组捕获的内容
index:第一项中大正则捕获内容首字符的索引
input:元字符串
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

var str="html5css3es6"
var reg=/([a-z]+)(\d)/g;

变形分组捕获↓↓↓↓↓↓↓↓↓↓↓
var s="";
var re=reg.exec(str);
while(re){
s+re[1]+"版本是"+re[2]+" "
re=reg.exec(str)
}
console.log(s);

1.match,有分组的时候正则加上修饰符"g" 但是无法是捕获到分组内容

2.不加修饰符"g",跟exec结果一样,只能捕获一次

总结:如果有分组,想要获取分组的内容只能用exec了

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

总结:

没有分组的情况下,想要把所有的匹配内容一次性捕获出来就用match

有分组的情况下 想要捕获分组的内容只能用exec循环捕获

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=

正则的贪婪性(¯﹃¯)

贪婪性虽然只捕获一次,但是把这次的满足条件的全部匹配项都获取出来了......
var reg=/\d+/g;
var str='womenshi2017年第4pidoukaoyibaifenyemyong';
console.log(reg.exec(str))

如何解决? ⤵️
量词后面加上"?"问号 ⬇️⬇️⬇️

var reg=/\d+?/;
console.log(reg.exec(str));

问号"?"放在一个普通的元字符后面代表匹配0-1个 \d?数字可以有一个也可以没有,放在一个量词元字符后面是取消捕获时的贪婪性

"?:" 加在小括号前面表示只匹配不捕获⤵️

var str="js[2016]css[2017]html[2018]";
var reg=/[a-z]+\(?:[\d{4}\])[a-z]+\1/g;
因为"?:" 表示不捕获,所以\1就没有代表的内容
console.log(reg.exec(str);)

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

转载于:https://www.cnblogs.com/Jiazexin/p/7080308.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值