(?:exp)這樣匹配表達式exp表示什麼意思?

(?:exp)這樣匹配表達式exp表示什麼意思?

(?:exp) 非捕獲組,匹配exp的內容,但不捕獲到組裏

至於作用,一般來說是爲了節省資源,提高效率
*********************************************
比如說驗證輸入是否爲整數,可以這樣寫
^([1-9][0-9]*|0)$
這時候我們需要用到()來限制“|”表示“或”關係的範圍,但我們只是要判斷規則,沒必要把exp匹配的內容保存到組裏,這時就可以用非捕獲組了
^(?:[1-9][0-9]*|0)$

以上只是一個簡單的例子,或許會覺得無所謂,但是如下的日期正則,如果全都用捕獲組,那就是對資源的極大浪費了

^(?:(?:(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))([-/.])(?:0?2\1(?:29)))|(?:(?:(?:1[6-9]|[2-9]\d)?\d{2})([-/.])(?:(?:(?:0?[13578]|1[02])\2(?:31))|(?:(?:0?[13-9]|1[0-2])\2(29|30))|(?:(?:0?[1-9])|(?:1[0-2]))\2(?:0?[1-9]|1\d|2[0-8]))))$

有的時候我們不得不用(),而()默認情況下會將其中exp匹配的內容捕獲到組裏,而有些情況我們只是判斷規則,或者後面並不需要對此處()中匹配的內容進行引用時,就沒有必要把它捕獲到組裏了,一方面會造成資源的浪費,另一方面會降低效率,這時候就要用到非捕獲組了

*********************************************
比如說驗證輸入是否爲整數,可以這樣寫
^([1-9][0-9]*|0)$
但是我認爲這裏沒有必要用()啊
-----------------
這裏又涉及到“|”的用法了,舉例說下吧
源字符串:123.456
正則表達式一:^([1-9][0-9]*|0)$
正則表達式二:^[1-9][0-9]*|0$

正則表達式一匹配失敗,因爲它不符合規則
正則表達式二匹配成功,匹配內容爲123

因爲此時正則表達式二是把“|”兩側整體作爲“或”的關係了即
^[1-9][0-9]*
或者
0$

用abc3210作爲源字符串時行匹配,正則表達式二也是匹配成功的,匹配內容爲0


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章