正則的捕獲:exec,返回的結果是陣列或null
先看個demo
var reg = /\d+/var str = "hua123hua456";
var result =reg.exec(str);
console.dir(result)
//["123", index: 3, input: "hua123hua456"]
console.log(reg.lastindex) //
0console.log(result.input) //
原字串str
console.log(result.index) //
匹配到字串的初始index,這裡是2
如果你第一次用exec,估計你是猜不到答案的
捕獲的結果是乙個陣列,因為有符合正則的字串,但是只有乙個,而且還是123,不是1,或者12之類的.
這裡涉及到捕獲的兩個特點:貪婪性和懶惰性.
所謂的貪婪性:每次匹配按照匹配最長的結果捕獲的,也就是若1符合正則,12也符合正則,那麼將捕獲12
所謂的懶惰性:每次執行exec只捕獲第乙個匹配的內容,在不進行任何處理的情況下,捕獲的始終是第乙個匹配的內容,且正則的lastindex還是預設的0.
顯然真要用的話,這樣的缺點很麻煩,所以要克服.
1.克服懶惰性
之前說了乙個修飾符,g,恩,這裡可以用來解決懶惰性.
加了g之後:正則每一次捕獲之後lastindex的值變成最新的值 下一次捕獲從最新的位置開始查詢,這樣就可以把所有需要捕獲的內容都獲取到
看個demo
var reg = /\d+/g;var str = "h123u456";
console.log(reg.lastindex); //0
console.log(reg.exec(str)); //
["123", index: 1, input: "h123u456"]
console.log(reg.lastindex); //
4 console.log(reg.exec(str)); //
["456", index: 5, input: "h123u456"]
console.log(reg.lastindex); //
8 console.log(reg.exec(str)); //
null
console.log(reg.lastindex); //
0 console.log(reg.exec(str)); //
["123", index: 1, input: "h123u456"]
console.log(reg.lastindex); //
4 console.log(reg.exec(str)); //
["456", index: 5, input: "h123u456"]
console.log(reg.lastindex); //
8 console.log(reg.exec(str)); //
null
每次捕獲到字串之後,lastindex會從下乙個字串的位置開始,匹配的結果直到null才算結束,後面會一直重複,所以為了得到所有的字串,可以寫個迴圈
functionfindstr (reg,str)
return
arr;
}findstr (/\d+/g,"hua123hua456"); //
["123","456"]
不過其實一般是不用findstr這個方法的,因為字串物件本身有個match的方法
"123uu556kk90".match(/\d+/g); //["123","556","90"]別忘了加g,不然只匹配一次,懶惰性
2.克服貪婪性
在量詞元字元後面加?即可.
?在正則中的作用:
a. 放在普通的元字元後面表示出現0-1次
b.放在量詞元字元後面是取消捕獲時候的貪婪性
舉個栗子
var regg = /\d+?/g;findstr (regg,str);
//["1","2","3","4","5","6"]
回憶下量詞元字元:*,+,?,
總結下:
解決懶惰性,g
解決貪婪性,?
正則的捕獲
正則的捕獲 exec,返回的結果是陣列或null 先看個demo var reg d var str hua123hua456 var result reg.exec str console.dir result 123 index 3,input hua123hua456 console.log ...
正則捕獲的複習
var reg zhu d g var str zhu1234zhu3456zhu5678 我們用exec執行三次,每一次不僅僅把大正則匹配的獲取到,而且還可以獲取第乙個分組匹配的內容 console.log reg.exec str zhu1234 1234 console.log reg.exe...
Grok 正則捕獲
grok 正則捕獲 s d d s 回顧下 pattern 匹 配 pattern 但不獲取匹配結果,也就是說這是乙個非獲取匹配,不進行儲存供以後使用。這在使用 或 字元 來組合乙個模式的各個部分是很有用。例如,industr y ies 就是乙個比 industry industries 更簡略的...