javascript正則表達式---正向預查


什么是正向預查?這里有騰訊招聘的一個例子:

如何給一串數字用千分制表示?比如9999999999變成9,999,999,999。這樣一個問題你會怎么答呢?博主js正則學的不咋樣,然后用操作字符串的辦法做,變成字符串,先除以3,看有幾對,然后再加逗號…………(省略無數個步驟)

直到有一天我看到了這樣一個回答:

 var f = '99999999999'.replace(/\d{1,3}(?=(\d{3})+$)/g, '$&,');
console.log(f);

一行代碼搞定了。我當時是驚呆的0.0,但是不知道這是啥意思阿。就重新學了一遍正則,發現里面有個叫正向預查的東西,很神奇,就一起來看看這是什么鬼。

(?=)這個東西就是正向預查。

先給一個簡單的例子:

var con="coming soon,going gogogo"
var reg = /\b[\w]+(?=ing\b)/g;//匹配帶ing的單詞,但是不要ing。注意:如果ing后不加\b,類似於goingabc也會匹配。
 console.log(con.match(reg));

這里匹配到["com", "go"]。先匹配單詞邊界\b,然后+匹配前面多次或者一次,然后到這個正向預查,(?=ing)表示先向后探測,看看有沒有ing。如果有,則把前面的匹配出來;如果沒有,則光標往后移一位,繼續探測。這個過程就是正向預查:預先判斷為某個值。然后匹配到的東西不包含這個元素,這里也就是ing。官方原話是該匹配不需要獲取以供以后使用,是一個非捕獲匹配。

相似的還有非捕獲性數組: (?: ) 

var color = "#990000";
/#(?:\d+)/.test(color);
alert(RegExp.$1);//""

這里的正向預查,屬於零寬斷言,也是正向前瞻。

正向前瞻用來檢查接下來的出現的是不是某個特定的字符集。而負向前瞻則是檢查接下來的不應該出現的特定字符串集。零寬斷言是不會被捕獲的。

不過javascript不支持后瞻。

好,回到我們的問題,為了方便觀察,我們換做1234567890來匹配

`1234567890`.match(/\d{1,3}(?=(\d{3})+$)/g)
\d首先貪婪匹配123,成功,進入順序肯定環視,456,789匹配成功,控制權交到$匹配789,匹配失敗,回溯

\d匹配12,成功,進入順序肯定環視,345,678匹配成功,控制權交到$匹配678,匹配失敗,回溯

\d匹配1,成功,進入順序肯定環視,234,567,890,控制權交到$匹配890,匹配成功.


\d貪婪匹配234,成功,進入順序肯定環視,567,890匹配成功,控制權交到$匹配890,匹配成功

\d貪婪匹配567,成功,進入順序肯定環視,890匹配成功,控制權交到$匹配890,匹配成功

\d貪婪匹配890,成功,進入順序肯定環視,匹配空字符串匹配失敗,匹配失敗。

\d匹配89,\d匹配8在順序肯定環視里都會失敗,於是返回。

文檔匹配1,234,567

還有一些資料:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM