摘要:因为做一道题,题目如下其中一个解答,引起了我对正则的研究兴趣,解答如下我对正则表达式中的正向肯定预查一直不带明白,所以趁这个机会研究一下。与此同时,对象的更新为下一次开始匹配的索引值。
因为做一道题(http://www.codewars.com/kata/insert-dashes/solutions/javascript),题目如下:
Write a function insertDash(num) that will insert dashes ("-") between
each two odd numbers in num. For example: if num is 454793 the output
should be 4547-9-3. Don"t count zero as an odd number.
其中一个解答,引起了我对正则的研究兴趣,解答如下:
function insertDash(num) { return String(num).replace(/([13579])(?=[13579])/g, "$1-"); }
我对正则表达式中的 正向肯定预查(?=pattern)一直不带明白,所以趁这个机会研究一下。
下面是我的测试代码:
var str = "13579"; var regArr = [ /([13579])([13579])/g, // capturing groups /([13579])(?:[13579])/g, // non-capturing groups /([13579])(?=[13579])/g // Assertions ]; regArr.forEach(function(reg){ console.log("regexp:", reg); while((q=reg.exec(str)) != null){ console.log(q, "lastIndex", reg.lastIndex); } console.log("result:", str.replace(reg, "$1-")); });
测试代码的输出:
regexp: /([13579])([13579])/g ["13", "1", "3", index: 0, input: "13579"] "lastIndex" 2 ["57", "5", "7", index: 2, input: "13579"] "lastIndex" 4 result: 1-5-9 regexp: /([13579])(?:[13579])/g ["13", "1", index: 0, input: "13579"] "lastIndex" 2 ["57", "5", index: 2, input: "13579"] "lastIndex" 4 result: 1-5-9 regexp: /([13579])(?=[13579])/g ["1", "1", index: 0, input: "13579"] "lastIndex" 1 ["3", "3", index: 1, input: "13579"] "lastIndex" 2 ["5", "5", index: 2, input: "13579"] "lastIndex" 3 ["7", "7", index: 3, input: "13579"] "lastIndex" 4 result: 1-3-5-7-9
regexObj.exec(str) 返回结果是一个数组,其中第一个成员是所匹配的字符串,接下来是捕获的分组,它有一个index 属性,表明是从哪个地方开始匹配的。与此同时,reg 对象的 lastIndex 更新为下一次开始匹配的索引值。
/([13579])([13579])/g 每次匹配两个字符,下次开始匹配位置 +2, 每次产生两个捕获分组;
/([13579])(?:[13579])/g, 每次也匹配两个字符,下次开始匹配位置 +2, 由于使用了非捕获匹配,所以每次产生一个捕获分组;
/([13579])(?=[13579])/g, (?=[13579])只帮助定位匹配的位置,并不属于匹配的字符,所以每次匹配一个字符,所以下一次开始匹配位置 +1 ;
参考https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/86073.html
摘要:非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。 导读 你有没有在搜索文本的时候绞尽脑汁, 试了一个又一个表达式, 还是不行. 你有没有在表单验证的时候, 只是做做样子(只要不为空就好), 然后烧香拜佛, 虔诚祈祷, 千万不要出错. 你有没有在使用sed 和 grep 命令的时候, 感觉莫名其妙, 明明应该支持的元字符, 却就是匹配不到. 甚至,...
摘要:关于,新手理解起来可能比较困难,尤其是一些很牛逼的预查正则表达式。非贪婪与贪婪的问题贪婪出现在这种不确定数量的匹配中,所谓的贪婪,表示正则表达式在匹配的时候,尽可能多的匹配符合条件的内容。 学习了半年的正则表达式,也不能说一直学习吧,就是和它一直在打交道,如何用正则表达式解决自己的问题,并且还要考虑如何在匹配大量的文本时去优化它。慢慢的觉得正则已经成为自己的一项技能,逐渐的从一个正则表...
摘要:关于,新手理解起来可能比较困难,尤其是一些很牛逼的预查正则表达式。非贪婪与贪婪的问题贪婪出现在这种不确定数量的匹配中,所谓的贪婪,表示正则表达式在匹配的时候,尽可能多的匹配符合条件的内容。 学习了半年的正则表达式,也不能说一直学习吧,就是和它一直在打交道,如何用正则表达式解决自己的问题,并且还要考虑如何在匹配大量的文本时去优化它。慢慢的觉得正则已经成为自己的一项技能,逐渐的从一个正则表...
摘要:正则起源最近看完了精通正则表达式,收获颇丰,略过了一些晦涩难懂的理论部分,主要看了实战和教程部分。然后下面说一下以上两个基础教程里没说到的知识点。最后以上是我在精通正则表达式一书中得到的一些收获,希望能分享给大家,如有错误欢迎指正。 正则起源 最近看完了 《精通正则表达式》,收获颇丰,略过了一些晦涩难懂的理论部分,主要看了实战和教程部分。 下面引用一下百度百科里的内容。 正则表达式的鼻...
阅读 1371·2021-10-11 11:12
阅读 3183·2021-09-30 09:46
阅读 1613·2021-07-28 00:14
阅读 3116·2019-08-30 13:49
阅读 2567·2019-08-29 11:27
阅读 3138·2019-08-26 11:52
阅读 566·2019-08-23 18:14
阅读 3419·2019-08-23 16:27