php正则表达式正向预查,javascript正则表达式-----正向预查
前幾篇有用到過, 但是未做深入學習,發現一篇很好的博文
轉載自 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);//""
這里的正向預查,屬于零寬斷言,也是正向前瞻。
零寬斷言
正則
名稱
描述
(?=exp)
正向前瞻
匹配exp前面的位置
(?!exp)
負向前瞻
匹配后面不是exp的位置
(?<=exp)
正向后瞻
匹配exp后面的位置(不支持)
(?!exp)
負向后瞻
匹配后面不是exp的位置(不支持)
正向前瞻用來檢查接下來的出現的是不是某個特定的字符集。而負向前瞻則是檢查接下來的不應該出現的特定字符串集。零寬斷言是不會被捕獲的。
不過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
還有一些資料:
image.png
image.png
總結
以上是生活随笔為你收集整理的php正则表达式正向预查,javascript正则表达式-----正向预查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab narxnet,请问吧里有
- 下一篇: matlab 代谢流分析,代谢网络流分析