Java正則相關(guān)的Pattern和Matcher類及遇到的坑
此篇文章是記錄我在學(xué)習(xí)Java正則表達(dá)式時(shí)候?qū)W到的和遇到的坑。
先來(lái)說(shuō)說(shuō) Matcher 里面的三個(gè)方法(取的結(jié)果以group()方法為例子)
- matches():整個(gè)匹配,只有整個(gè)字符序列完全匹配成功,才返回True,否則返回False。但如果前部分匹配成功,將移動(dòng)下次匹配的位置。舉個(gè)例子如果字符串為"a123",正則表達(dá)式為"\w\d\d\d",則matches()方法才返回true,換言之,就是要匹配的字符串需要跟正則表達(dá)式一一對(duì)應(yīng),字母對(duì)應(yīng)字母,數(shù)字對(duì)應(yīng)數(shù)字,所以稱之為完全匹配,錯(cuò)一位都不行。(這里的理解花了我好長(zhǎng)時(shí)間,網(wǎng)上搜到的都沒(méi)有提及,也許是我理解能力不夠)
- find():部分匹配,從當(dāng)前位置開(kāi)始匹配,找到一個(gè)匹配的子串,將移動(dòng)下次匹配的位置?!癴ind()像迭代器那樣向前遍歷輸入字符串?!?--摘自《Java編程思想??聪旅娴睦又械膄ind()方法,要匹配的字符串為"a123b",正則表達(dá)式為"\d\d\d",而最后輸出結(jié)果為:123,所以稱之為部分匹配,只要有,就返回true。
- lookingAt():部分匹配,總是從第一個(gè)字符進(jìn)行匹配,匹配成功了不再繼續(xù)匹配,匹配失敗了,也不繼續(xù)匹配。lookingAt()方法介于matches()和find()方法之間。lookingAt()方法的部分匹配指從第一位開(kāi)始匹配如果第一位沒(méi)有匹配到,就不再匹配,直接返回false,如果第一位匹配到了,則匹配第二位,以此類推。例子:要匹配的字符串為"a123b",正則表達(dá)式為"\w\d\d",輸出結(jié)果為"a12",很好理解,就是一位一位地匹配,匹配到了就匹配下一位。"\w\d\d"這個(gè)正則正好代表"字母數(shù)字?jǐn)?shù)字",所以正好輸出結(jié)果為a12。
好了上測(cè)試代碼:
package com.wjj.utils; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author 作者 : 榨菜哥 * @version 創(chuàng)建時(shí)間:2016年8月18日 上午8:47:58 * 類說(shuō)明:正則表達(dá)式的練習(xí) */ public class Regex { //find方法測(cè)試 public static void find(String html) { String regex = "\\d\\d\\d"; Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(html); System.out.print("find():"); if (matcher.find()) { System.out.println(matcher.group()); } } //matches方法測(cè)試 public static void matches(String html) { String regex = "^\\w\\d\\d\\d"; Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(html); System.out.print("matches():"); if (matcher.matches()) { System.out.println(matcher.group()); } } //lookingAt方法測(cè)試 public static void lookingAt(String html) { String regex = "\\w\\d\\d"; Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(html); System.out.print("lookingAt():"); if (matcher.lookingAt()) { System.out.println(matcher.group()); } } public static void main(String[] args) { //find方法測(cè)試 find("a123b"); //matches方法測(cè)試 matches("a123"); //lookingAt方法測(cè)試 lookingAt("a123b"); } }
輸出結(jié)果:
find():123
matches():a123
lookingAt():a12
小結(jié):正則表達(dá)式本身并不難,平常使用的時(shí)候只要按照規(guī)則來(lái)寫(xiě)就好了。在學(xué)習(xí)中理解matches、find、和lookingAt三個(gè)方法花了我比較長(zhǎng)的時(shí)間,一直不能理解完全匹配和部分匹配是什么意思,最后還是在stackoverflow上找到了想要的答案。
以上是個(gè)人學(xué)習(xí)的理解,有不對(duì)之處,希望給予指點(diǎn)。
(補(bǔ)充:正則表達(dá)式Pattern如果調(diào)用多次容易出問(wèn)題,比如內(nèi)存溢出,因?yàn)镻attern每執(zhí)行一次就編譯一次正則表達(dá)式,因此建議將需要的正則表達(dá)式進(jìn)行預(yù)編譯。)
正則表達(dá)式學(xué)習(xí)教程: http://deerchao.net/tutorials/regex/regex.htm ,文中作者寫(xiě)得挺詳細(xì)的,并且通俗易懂。
總結(jié)
以上所述是小編給大家介紹的Java正則相關(guān)的Pattern和Matcher類及遇到的坑,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
如何使用JavaScript和正則表達(dá)式進(jìn)行數(shù)據(jù)驗(yàn)證
利用客戶端JavaScript的優(yōu)勢(shì),JavaScript中的正則表達(dá)式可以簡(jiǎn)化數(shù)據(jù)驗(yàn)證的工作,下面與大家分享下如何使用JavaScript和正則表達(dá)式進(jìn)行數(shù)據(jù)驗(yàn)證,感興趣的朋友可以參考下哈2013-05-05Java中使用正則表達(dá)式處理文本數(shù)據(jù)
正則表達(dá)式就是一個(gè)字符串,但和普通的字符串不同的是,正則表達(dá)式是對(duì)一組相似字符串的抽象。本文將給大家介紹java中使用正則表達(dá)式處理文本數(shù)據(jù)的相關(guān)的資料,感興趣的朋友一起看看吧2015-10-10學(xué)習(xí)正則!超基礎(chǔ)簡(jiǎn)單例子
我一直都覺(jué)得正則表達(dá)式只要在要用的時(shí)候翻一下百度就Ok了,然后今天寫(xiě)php的時(shí)候發(fā)現(xiàn),原來(lái)我正則完全一點(diǎn)都不懂2012-09-09js中exec、test、match、search、replace、split用法
exec、test、match、search、replace、split在JS中用的很頻繁,在網(wǎng)上看到對(duì)這些方法的總結(jié),就轉(zhuǎn)過(guò)來(lái)了,作個(gè)記錄2012-08-08正則表達(dá)式去除中括號(hào)(符號(hào))及里面包含的內(nèi)容
這篇文章主要介紹了正則表達(dá)式去除中括號(hào)(符號(hào))及里面包含的內(nèi)容,文中給大家提到了正則表達(dá)式提取括號(hào)內(nèi)內(nèi)容,需要的朋友可以參考下2019-06-06用Javascript正則實(shí)現(xiàn)url鏈接的解析類
一個(gè)非常健全的 Javascript 鏈接(URL)解析類,他用了正則表達(dá)式可以準(zhǔn)確獲取一個(gè)完整的 URL 中每個(gè)部分的內(nèi)容,包括協(xié)議、URL中包含的用戶名和密碼、主機(jī)名、端口、路徑名、參數(shù)、錨點(diǎn)(Fragment Anchor)等信息2008-06-06正則表達(dá)式實(shí)現(xiàn)字符的模糊匹配功能示例
這篇文章主要介紹了正則表達(dá)式實(shí)現(xiàn)字符的模糊匹配功能,結(jié)合具體java實(shí)例形式分析了針對(duì)字符串的模糊匹配查詢相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-05-05