摘要:本篇主要解疑正則表達(dá)式的占有型量詞。貪婪型結(jié)果在不做任何額外處理情況下,正則表達(dá)式默認(rèn)是貪婪型的。結(jié)果皆為注意括號(hào)。說(shuō)點(diǎn)什么占有量詞是一種用來(lái)組織正則表達(dá)式嘗試所有排列組合的方式。
針對(duì)“*”、“+”、“?”等限定符都是貪婪的(盡可能多的匹配字符),通過(guò)在最后追加“+”或“?”量詞可改變貪婪性。本篇主要解疑正則表達(dá)式的“占有型量詞”(Possessive Quantifiers)。
Greediness(貪婪型)Pattern p = Pattern.compile("[.+][.+]"); Matcher m = p.matcher("[che][1]"s blog is [rebey.cn][2],and built in [2016][3]."); while(m.find()) { System.out.println(m.group()); } // 結(jié)果:[che][1]"s blog is [rebey.cn][2],and built in [2016][3]
在不做任何額外處理情況下,正則表達(dá)式默認(rèn)是貪婪型的。貪婪型一次讀取所有字符進(jìn)行匹配。
以下是匹配過(guò)程猜想:
“[.+”先遍歷到字符“.”時(shí)發(fā)現(xiàn)不匹配了,開始往左回溯,得到“[che...]”;
繼續(xù)往左回溯,像這樣“che...”,因此就有了以上的輸出結(jié)果。
Pattern p1 = Pattern.compile("[.+?][.+?]"); Matcher m1 = p1.matcher("[che][1]"s blog is [rebey.cn][2],and built in [2016][3]."); while(m1.find()) { System.out.println(m1.group()); } // 結(jié)果: // [che][1] // [rebey.cn][2] // [2016][3]
在原有的“.+”之后加個(gè)“?”,就成為了勉強(qiáng)型。它將從左至右依次讀取進(jìn)行匹配,直到字符串結(jié)束。
Possessive(占有型)Pattern p2 = Pattern.compile("[.++][.++]"); Matcher m2 = p2.matcher("[che][1]"s blog is [rebey.cn][2],and built in [2016][3]."); while(m2.find()) { System.out.println(m2.group()); } // 結(jié)果:匹配不到
在原有的“.+”之后加個(gè)“+”,就成為了占有型。它也是一次讀取所有字符串進(jìn)行匹配,區(qū)別在于它不回溯。
以下是匹配過(guò)程猜想:
“[.+”匹配“[che...”直到最后字符“.”不匹配,立即結(jié)束。
Pattern p3 = Pattern.compile("[.++"); Matcher m3 = p3.matcher("[che][1]"s blog is [rebey.cn][2],and built in [2016][3]."); while(m3.find()) { System.out.println(m3.group()); } Pattern p4 = Pattern.compile("(?>([.+))"); Matcher m4 = p4.matcher("[che][1]"s blog is [rebey.cn][2],and built in [2016][3]."); while(m4.find()) { System.out.println(m4.group()); } 結(jié)果皆為:[che][1]"s blog is [rebey.cn][2],and built in [2016][3].
注意括號(hào)。
說(shuō)點(diǎn)什么Possessive quantifiers are a way to prevent the regex engine from trying all permutations.
占有量詞是一種用來(lái)組織正則表達(dá)式嘗試所有排列組合的方式。(即不回溯)
With a possessive quantifier, the deal is all or nothing.
使用占有量詞只有兩種結(jié)果,全匹配或者空匹配。
The main practical benefit of possessive quantifiers is to speed up your regular expression.
占有量詞的主要實(shí)際意義是加速你的正則表達(dá)式。
更多有意思的內(nèi)容,歡迎訪問(wèn)筆者小站: rebey.cn
參考文獻(xiàn)Regex Tutorial - Possessive Quantifiers
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/67563.html
摘要:匹配次匹配次匹配次匹配次匹配次,等價(jià)于匹配次,等價(jià)于元字符在正則表達(dá)式中有一些具有特殊含義的字母,被稱為元字符,簡(jiǎn)言之,元字符就是描述字符的字符,它用于對(duì)字符表達(dá)式的內(nèi)容轉(zhuǎn)換及各種操作信息進(jìn)行描述。 showImg(https://segmentfault.com/img/remote/1460000018489886?w=2000&h=1125); 正則表達(dá)式是很多程序員,甚至是一些...
摘要:如字段,使用,會(huì)匹配出使用,會(huì)匹配出元字符在正則表達(dá)式中有一些具有特殊含義的字母,被稱為元字符,簡(jiǎn)言之,元字符就是描述字符的字符,它用于對(duì)字符表達(dá)式的內(nèi)容轉(zhuǎn)換及各種操作信息進(jìn)行描述。 關(guān)于正則表達(dá)式的教程網(wǎng)上實(shí)在太多,但都不太友好,在此我整理一篇,面向自己行文。 學(xué)正則需要記語(yǔ)法,最好的方式無(wú)非就是實(shí)操,邊寫邊學(xué),因此第一步,推薦一個(gè)在線工具: 在線工具 regex101 正則的在線工...
摘要:正則表達(dá)式是一個(gè)強(qiáng)大的字符串處理工具,可以對(duì)字符串進(jìn)行查找提取分隔替換等操作。例如,正則表達(dá)式用于匹配的三個(gè)訪問(wèn)控制符其中之一邊界匹配符數(shù)量標(biāo)識(shí)符貪婪模式數(shù)量表示符默認(rèn)采用貪婪模式。方法以空格為分隔符,將字符串分割成多個(gè)子串哈哈 正則表達(dá)式是一個(gè)強(qiáng)大的字符串處理工具,可以對(duì)字符串進(jìn)行查找、提取、分隔、替換等操作。String類里提供了如下幾個(gè)特殊方法 boolean matches(...
摘要:續(xù)上基礎(chǔ)通俗三類常用的的簡(jiǎn)寫形式偷懶需要用來(lái)對(duì)某一類特定字符進(jìn)行匹配,通常,我們用的最多的字符就是下面的三類數(shù)字,字母和這類看不到占位符,上一部分學(xué)過(guò)通過(guò)方括號(hào)表示這三類的的方法由于上面的表達(dá)試比較長(zhǎng),所以需要有一種更簡(jiǎn)單的寫法可以 續(xù)上:[Regular Expression]Mastering Python Regular Expression基礎(chǔ)通俗(1) 三類常用的meta...
摘要:正則表達(dá)式是由普通字符例如字符到以及特殊字符稱為元字符組成的文字模式。方法參數(shù)一個(gè)正則表達(dá)式對(duì)象。如果正則表達(dá)式?jīng)]有標(biāo)志,則會(huì)返回和相同的結(jié)果。其被視為一整個(gè)字符串,而不是一個(gè)正則表達(dá)式。 正則表達(dá)式 正則表達(dá)式(Regular Expression)是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為元字符)。正則表達(dá)式使用單個(gè)字符串來(lái)描述、匹配一系列匹配某個(gè)...
閱讀 2680·2021-11-12 10:36
閱讀 2341·2021-08-23 09:47
閱讀 1779·2019-08-30 15:44
閱讀 1460·2019-08-30 14:10
閱讀 2327·2019-08-29 16:52
閱讀 2399·2019-08-29 16:40
閱讀 1652·2019-08-29 16:17
閱讀 2476·2019-08-26 13:21