亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

正則表達式中 ?= 和 ?: 的區別到底在哪里

正則表達式中 ?= 和 ?: 的區別到底在哪里

HUWWW 2018-11-13 13:15:27
直接上例子:每三個數字中間加逗號"123456789".replace(/(\d{3})(?:[^$])/g, "$1,");//"123,567,9""123456789".replace(/(\d{3})(?=[^$])/g, "$1,");//"123,456,789"再上一個之前論壇里出現過的例子,也是每三個數字中間加逗號先看看 (?=pattern) 的使用,下面這個是正確的:function groupByCommas(n) {  return n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");}console.log(groupByCommas(1234567));    //1,234,567如果我們把 ?= 換成 ?: 的話:function groupByCommas(n) {  return n.toString().replace(/\B(?:(\d{3})+(?!\d))/g, ",");}console.log(groupByCommas(1234567));    //1,兩者的概念不用多說,查到有回答說:區別在于 ?= 是正向肯定 斷言,進行的匹配是不占查詢長度的;而 ?: 是非獲取匹配,進行的匹配是占據查詢長度的。但是還是不是很理解這里的查詢占據長度的說法,對著例子解釋,難道是說第一個例子(?=[^$])匹配的是非結尾,所以123之后的非結尾的長度最小是1個字符,所以把4給一起替代了?那怎么不直接替代到結尾呢? 第二個例子(?=(\d{3})+(?!\d))匹配的是3或3的倍數個數字,直接匹配到了結尾,所以把234567也直接替代了?所以我的理解肯定是不對的理解的不是很透徹,歡迎各位對著例子來解答一下我的困惑,不勝感激!
查看完整描述

1 回答

?
www說

TA貢獻1775條經驗 獲得超8個贊

  1. "123456789".replace(/(\d{3})(?:[^$])/g, "$1,");
    ()表示捕獲型括號,(?:)表示非捕獲型括號,所以第一個括號匹配的內容會放在$1中,第二個括號匹配的內容不會放在$2中。\d{3}表示連續三個數字,[^$]表示匹配一個字符,只要這個字符不是$符號,需要注意的是[]表示匹配里面的任意一個字符,但是肯定是要有一個的,所以[]匹配出來的字符的長度肯定是1,不存在0的情況,另外在[$]里面的符號是沒有特殊含義的,就是這個字符,而不是匹配字符串的結尾。
    因為\d{3}匹配三個字符,[^$]匹配一個字符,所以這個正則匹配4個字符;來看匹配過程,首先"1234"是滿足的,"123"匹配\d{3},"4"匹配[^$],此時$1="123",所以"1234"被替換成"123,"。然后從5開始下次匹配,類似的"5678"滿足條件,$1="567",所以"5678"被替換成"567,"。然后從9開始匹配,下面沒有匹配了,匹配結束,結果為"123,567,9"。

  2. "1234567".replace(/\B(?:(\d{3})+(?!\d))/g, ",");
    \B匹配非單詞邊界,也是一個位置,沒有寬度,(\d{3})+匹配3的倍數數字序列,且個數至少是3個,+是量詞,表示1到多次,默認是貪婪的,貪婪就是盡可能多的匹配,(?!d)表示這個位置后面不是數字。
    看例子,首先\B不匹配行首,所以匹配的位置移動到"1"后面的位置,此時\B匹配1后面的位置,然后"234", "567"匹配d{3},因為是貪婪匹配,所以(d{3})+匹配"234567",然后因為7后面是字符串的結尾了,所以滿足斷言(?!\d)不是數字,所以整個正則的匹配結果是"234567",所以"234567"被替換成了","。1不動,所以"1234567"變成了"1,"。

  3. "123456789".replace(/(\d{3})(?=[^$])/g, "$1,");
    這個正則表達式不滿足"千分位添加逗號"的需求,"123456789"只是個特例(位數正好是3的倍數),換成"12345678"結果是"123,456,78"。


查看完整回答
反對 回復 2018-12-21
  • 1 回答
  • 0 關注
  • 1742 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號