正则的捕获

来源:互联网 发布:双系统windows引导修复 编辑:程序博客网 时间:2024/06/06 19:17

正则的捕获:exec,返回的结果是数组或null

先看个demo

var reg = /\d+/var str = "hua123hua456";var result = reg.exec(str);console.dir(result) // ["123", index: 3, input: "hua123hua456"]console.log(reg.lastIndex) // 0console.log(result.input) // 原字符串strconsole.log(result.index) // 匹配到字符串的初始index,这里是2

 

 

如果你第一次用exec,估计你是猜不到答案的

捕获的结果是一个数组,因为有符合正则的字符串,但是只有一个,而且还是123,不是1,或者12之类的.

这里涉及到捕获的两个特点:贪婪性和懒惰性.

所谓的贪婪性:每次匹配按照匹配最长的结果捕获的,也就是若1符合正则,12也符合正则,那么将捕获12

所谓的懒惰性:每次执行exec只捕获第一个匹配的内容,在不进行任何处理的情况下,捕获的始终是第一个匹配的内容,且正则的lastIndex还是默认的0.

 

显然真要用的话,这样的缺点很麻烦,所以要克服.

1.克服懒惰性

之前说了一个修饰符,g,恩,这里可以用来解决懒惰性.

加了g之后:正则每一次捕获之后lastIndex的值变成最新的值 下一次捕获从最新的位置开始查找,这样就可以把所有需要捕获的内容都获取到

看个demo

    var reg = /\d+/g;    var str = "h123u456";    console.log(reg.lastIndex); // 0    console.log(reg.exec(str)); // ["123", index: 1, input: "h123u456"]    console.log(reg.lastIndex); // 4    console.log(reg.exec(str)); // ["456", index: 5, input: "h123u456"]    console.log(reg.lastIndex); // 8    console.log(reg.exec(str)); // null    console.log(reg.lastIndex); // 0    console.log(reg.exec(str)); // ["123", index: 1, input: "h123u456"]    console.log(reg.lastIndex); // 4    console.log(reg.exec(str)); // ["456", index: 5, input: "h123u456"]    console.log(reg.lastIndex); // 8    console.log(reg.exec(str)); // null

每次捕获到字符串之后,lastIndex会从下一个字符串的位置开始,匹配的结果直到null才算结束,后面会一直重复,所以为了得到所有的字符串,可以写个循环

function findStr (reg,str) {       var res = reg.exec(str);       var arr = [];       while(res){           arr[arr.length] = res[0];           res = reg.exec(str);       }      return arr;  }
findStr (
/\d+/g,"hua123hua456"); //["123","456"]

 不过其实一般是不用findStr这个方法的,因为字符串对象本身有个match的方法

"123uu556kk90".match(/\d+/g); // ["123","556","90"]别忘了加g,不然只匹配一次,懒惰性

这个方法的缺陷是获得分组的内容,俗称小正则,这个在下一篇文详说

2.克服贪婪性

在量词元字符后面加?即可.

?在正则中的作用:
a. 放在普通的元字符后面表示出现0-1次
b.放在量词元字符后面是取消捕获时候的贪婪性

举个栗子

var regg = /\d+?/g;findStr (regg,str); // ["1","2","3","4","5","6"]

 

回忆下量词元字符:*,+,?,{m,n}

 

总结下:

  解决懒惰性,g

  解决贪婪性,?

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 练瑜伽腿粗了怎么办 练完瑜伽腿粗怎么办 肚子大屁股大腿粗怎么办 甲状腺偏大弥漫性欠均匀怎么办 大腿后侧拉伤了怎么办 腰和臀部都疼怎么办 瑜伽后弯后腰疼怎么办? 吃了大蒜肝痛怎么办 练瑜伽前躯不行怎么办 月子里碰冷水了怎么办 月子手碰凉水了怎么办 月子里碰了冷水怎么办 顺产后下面会痛怎么办 产后肚子瘦不下来怎么办 出月子后臀部很疼怎么办 做月子时臀部疼怎么办 月子臀部大腿疼困怎么办 产后抱孩子腰疼怎么办 剖腹产后5年小肚子很大怎么办 压力大工作忙瘦了怎么办? 哺乳乳房一大一小怎么办 哺乳期乳房一大一小怎么办 上班之后奶少了怎么办 出了月子还流恶露怎么办? 剖腹产2年刀疤痒怎么办 刨宫产6天伤口痒怎么办 脸的皮肤油油的怎么办 狗狗子宫蓄脓怎么办 刮宫后子宫壁薄怎么办 产妇有痔疮怎么办很疼 二胎着床在剖腹产切口怎么办 刨腹产3月后怀孕怎么办 破腹产两年了肚子还是很大怎么办 抛妇产后肚子大怎么办 破腹产后想大便怎么办 破腹产后肚子硬怎么办 在月子里同房了怎么办 胃变大凸出来了怎么办 坐完月子脊背疼怎么办 月子过后脊背疼该怎么办 怀孕的时候牙疼怎么办