正则的捕获
正则的捕获: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) // 0 console.log(result.input) // 原字符串str console.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",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这个方法的,因为字符串对象本身有个match的方法 "123uu556kk90".match(/d+/g); // ["123","556","90"]别忘了加g,不然只匹配一次,懒惰性 这个方法的缺陷是获得分组的内容,俗称小正则,这个在下一篇文详说 2.克服贪婪性 在量词元字符后面加?即可. ?在正则中的作用: 举个栗子 var regg = /d+?/g; findStr (regg,str); // ["1","2","3","4","5","6"] 回忆下量词元字符:*,+,?,{m,n} 总结下: 解决懒惰性,g 解决贪婪性,? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- flex给编译后的swf减肥
- ruby – Mandrill-api Excon :: Errors :: Socke
- rawurlencode(json_encode([array]))
- org.postgresql.util.PSQLException: ERROR: rel
- c# – 为什么没有Times.Always在Moq?
- 深入理解基于vue-cli的vuex配置
- ruby-on-rails – 来自数组的RoR – collection_
- ArcGIS API For Flex(设置地图空间范围)
- ReactNative 到 Weex 的艰难一迈
- ruby – 如何查找所有对某个gem具有运行时依赖性