摘要:本篇主要解疑正則表達式的占有型量詞。貪婪型結(jié)果在不做任何額外處理情況下,正則表達式默認是貪婪型的。結(jié)果皆為注意括號。說點什么占有量詞是一種用來組織正則表達式嘗試所有排列組合的方式。
針對“*”、“+”、“?”等限定符都是貪婪的(盡可能多的匹配字符),通過在最后追加“+”或“?”量詞可改變貪婪性。本篇主要解疑正則表達式的“占有型量詞”(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]
在不做任何額外處理情況下,正則表達式默認是貪婪型的。貪婪型一次讀取所有字符進行匹配。
以下是匹配過程猜想:
“[.+”先遍歷到字符“.”時發(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]
在原有的“.+”之后加個“?”,就成為了勉強型。它將從左至右依次讀取進行匹配,直到字符串結(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é)果:匹配不到
在原有的“.+”之后加個“+”,就成為了占有型。它也是一次讀取所有字符串進行匹配,區(qū)別在于它不回溯。
以下是匹配過程猜想:
“[.+”匹配“[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].
注意括號。
說點什么Possessive quantifiers are a way to prevent the regex engine from trying all permutations.
占有量詞是一種用來組織正則表達式嘗試所有排列組合的方式。(即不回溯)
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.
占有量詞的主要實際意義是加速你的正則表達式。
更多有意思的內(nèi)容,歡迎訪問筆者小站: rebey.cn
參考文獻Regex Tutorial - Possessive Quantifiers
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/67563.html
摘要:匹配次匹配次匹配次匹配次匹配次,等價于匹配次,等價于元字符在正則表達式中有一些具有特殊含義的字母,被稱為元字符,簡言之,元字符就是描述字符的字符,它用于對字符表達式的內(nèi)容轉(zhuǎn)換及各種操作信息進行描述。 showImg(https://segmentfault.com/img/remote/1460000018489886?w=2000&h=1125); 正則表達式是很多程序員,甚至是一些...
摘要:如字段,使用,會匹配出使用,會匹配出元字符在正則表達式中有一些具有特殊含義的字母,被稱為元字符,簡言之,元字符就是描述字符的字符,它用于對字符表達式的內(nèi)容轉(zhuǎn)換及各種操作信息進行描述。 關于正則表達式的教程網(wǎng)上實在太多,但都不太友好,在此我整理一篇,面向自己行文。 學正則需要記語法,最好的方式無非就是實操,邊寫邊學,因此第一步,推薦一個在線工具: 在線工具 regex101 正則的在線工...
摘要:正則表達式是一個強大的字符串處理工具,可以對字符串進行查找提取分隔替換等操作。例如,正則表達式用于匹配的三個訪問控制符其中之一邊界匹配符數(shù)量標識符貪婪模式數(shù)量表示符默認采用貪婪模式。方法以空格為分隔符,將字符串分割成多個子串哈哈 正則表達式是一個強大的字符串處理工具,可以對字符串進行查找、提取、分隔、替換等操作。String類里提供了如下幾個特殊方法 boolean matches(...
摘要:續(xù)上基礎通俗三類常用的的簡寫形式偷懶需要用來對某一類特定字符進行匹配,通常,我們用的最多的字符就是下面的三類數(shù)字,字母和這類看不到占位符,上一部分學過通過方括號表示這三類的的方法由于上面的表達試比較長,所以需要有一種更簡單的寫法可以 續(xù)上:[Regular Expression]Mastering Python Regular Expression基礎通俗(1) 三類常用的meta...
摘要:正則表達式是由普通字符例如字符到以及特殊字符稱為元字符組成的文字模式。方法參數(shù)一個正則表達式對象。如果正則表達式?jīng)]有標志,則會返回和相同的結(jié)果。其被視為一整個字符串,而不是一個正則表達式。 正則表達式 正則表達式(Regular Expression)是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為元字符)。正則表達式使用單個字符串來描述、匹配一系列匹配某個...
閱讀 2624·2021-11-12 10:36
閱讀 2263·2021-08-23 09:47
閱讀 1683·2019-08-30 15:44
閱讀 1405·2019-08-30 14:10
閱讀 2246·2019-08-29 16:52
閱讀 2340·2019-08-29 16:40
閱讀 1590·2019-08-29 16:17
閱讀 2412·2019-08-26 13:21