正则的理解
元字符、量词的合写
/\d+/ 至少有一个数字
在字符串中查找与正则匹配的字符;
n+案例
var st="heoollo"
var reg=/o+/g 在字符串中至少有一个o
console.log(st.match(reg)) 结果为["oo","o"]
n*案例
var st="heoollo";
var reg=/o*/g 在字符串中匹配包含0个或多个o
console.log(st.match(reg)) 结果为["","","oo","","","o"];
显然这不是我们想要的结果;
所以另一种写法:在前面添加相邻的字母
案例
var st="heloollo"
var reg=/lo*/g 匹配 l 之后带0个或多个0的字符
console.log(st.match(reg)) 结果为["loo","l","lo"]
n?
var st="hellohlool"
var reg=/lo?/g 包含 l 之后带0个或1个o的字符
console.log(st.match(reg)) 结果为["l","lo","lo","l"];
n{x} x个n
var st="helloohoo"
var reg=/lo{2}/g 翻译为:var reg=/loo/g
console.log(st.match(reg)); 结果为["loo"]
?=n 指定一个后面必须跟着n的字符串,返回结果不带n,使用过程中加()
var st="hellohho"
var reg=/h(?=o)/g 全局匹配找一个h后面找o的h
console.log(st.match(reg)); 结果为["h"]
/ln+/ l后面至少有一个n;
/ln*/ l后面有0个或多个n;
/ln?/ l后面有0个或1个n;
/l(?=n)/ l后面紧跟着n,返回的是l,如果l后面没有n,返回的是null;
正则RegExp(类)
概念:用来检验字符串的规则;
定义:通过这两种方法定义一个正则;
1.var reg=/格式/
2.var reg=new RegExp
其本质都是一个对象
方法:
1.test() 匹配的方法
2.exec() 捕获的方法
修饰符: i m g
[ ]
元字符:
量词 (详情见上一章)
正则的理解:
1.正则的懒惰性:
2.正则的贪婪性;
懒惰性;
每一次在exec()中捕获的时候,只捕获第一次匹配的内容,而不往下捕获了,我们把这种方式叫正则的懒惰性;
捕获开始的位置都是从0开始;
解决正则的懒惰性
修饰符:g 全局匹配;
案例:
var st="hello45612world12345"
var reg=/\d+/g
console.log(reg.exec(st)); 结果为:45612 这就是正则的懒惰性,每次只输出第一次匹配上的
console.log(reg.exec(st)); 结果为:12345 再次输出的话,就发现他捕获的位置从第一次输出后就开始捕获,不再从零捕获(正是因为g的全局捕获)
正则的实例对象reg有一个lastlndex的属性,捕获的起始位置;
如何将捕获的内容汇聚在一起:
console.log(st.match(reg)); 利用字符换中match的方法即可
正则的贪婪性:
正则每次捕获都是按照最长的结果,我们把这种功能叫正则的贪婪性;
案例:
var st="hello12345"
var reg=/\d+/g;
console.log(reg.exec(st)); 结果为["12345"] 只捕获到最长的数字 不会是1,或1,2直接就是1,2,3,4,5
怎样处理正则的贪婪性:
在元字符量词的后面加?
案例:
var st="hello456121245"
var reg=/\d+?/g
console.log(st.match(reg))
分组捕获,正则里面带(),就是分组捕获;
/(a)(b)/ 解析:外面一个大正则,里面带了两个小正则; (先算())
分组捕获的优点:1.可以改变优先级;
2.可以分组引用;
分组引用\1,\2 \1代表和第一个分组出现的一模一样,\2和第二个分组出现的一模一样
在数分组的个数时,从左往右;
/(a)(b)/ (分组也是一个整体)
第一组:(ab)
第二组:(a)
第三组:(b)
案例:
var reg=/(\w)\1(\w)\2/
var st="ssdd";
console.log(reg.test(reg)) 只有这样才会返回true
案例二:
var reg=/(a)\1(b)\2/
var st="aabb"
console.log(reg.test(reg)) 只用这样才会返回true
解析这种写法的意思:
第一个是分组,且是一个单词字符,第二个是个分组引用,要求和第一组一模一样,第三个是第二个分组且是一个单词字符,第四个是一个分组引用,要求和第二组一模一样
分组捕获:
分组捕获的前提是正则存在分组,不仅把大正则的内容捕获到把小正则的内容捕获到;
案例:
var st="absd";
var reg=/(a)(b)/;
console.log(reg.exec(st)) 结果为["ab","a","b"]
怎么解除分组捕获,如果你不想捕获某一个分组的内容,在分组前面加一个?:就可以了;
案例:
var st="absd";
var reg=/(a)(?:b)/
console.log(reg.exec(st)) 结果为["ab","a"]