摘要:因為做一道題,題目如下其中一個解答,引起了我對正則的研究興趣,解答如下我對正則表達式中的正向肯定預查一直不帶明白,所以趁這個機會研究一下。與此同時,對象的更新為下一次開始匹配的索引值。
因為做一道題(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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/86073.html
摘要:非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。 導讀 你有沒有在搜索文本的時候絞盡腦汁, 試了一個又一個表達式, 還是不行. 你有沒有在表單驗證的時候, 只是做做樣子(只要不為空就好), 然后燒香拜佛, 虔誠祈禱, 千萬不要出錯. 你有沒有在使用sed 和 grep 命令的時候, 感覺莫名其妙, 明明應該支持的元字符, 卻就是匹配不到. 甚至,...
摘要:關于,新手理解起來可能比較困難,尤其是一些很牛逼的預查正則表達式。非貪婪與貪婪的問題貪婪出現在這種不確定數量的匹配中,所謂的貪婪,表示正則表達式在匹配的時候,盡可能多的匹配符合條件的內容。 學習了半年的正則表達式,也不能說一直學習吧,就是和它一直在打交道,如何用正則表達式解決自己的問題,并且還要考慮如何在匹配大量的文本時去優化它。慢慢的覺得正則已經成為自己的一項技能,逐漸的從一個正則表...
摘要:關于,新手理解起來可能比較困難,尤其是一些很牛逼的預查正則表達式。非貪婪與貪婪的問題貪婪出現在這種不確定數量的匹配中,所謂的貪婪,表示正則表達式在匹配的時候,盡可能多的匹配符合條件的內容。 學習了半年的正則表達式,也不能說一直學習吧,就是和它一直在打交道,如何用正則表達式解決自己的問題,并且還要考慮如何在匹配大量的文本時去優化它。慢慢的覺得正則已經成為自己的一項技能,逐漸的從一個正則表...
摘要:正則起源最近看完了精通正則表達式,收獲頗豐,略過了一些晦澀難懂的理論部分,主要看了實戰和教程部分。然后下面說一下以上兩個基礎教程里沒說到的知識點。最后以上是我在精通正則表達式一書中得到的一些收獲,希望能分享給大家,如有錯誤歡迎指正。 正則起源 最近看完了 《精通正則表達式》,收獲頗豐,略過了一些晦澀難懂的理論部分,主要看了實戰和教程部分。 下面引用一下百度百科里的內容。 正則表達式的鼻...
閱讀 1421·2021-10-11 11:12
閱讀 3252·2021-09-30 09:46
閱讀 1638·2021-07-28 00:14
閱讀 3141·2019-08-30 13:49
閱讀 2589·2019-08-29 11:27
閱讀 3240·2019-08-26 11:52
閱讀 606·2019-08-23 18:14
閱讀 3441·2019-08-23 16:27