上篇文章講述了正則表達式的語法規(guī)則和一些用法說明冶伞,詳情參見:
半小時學(xué)會正則表達式(上)
這篇文章通過實現(xiàn)5個小功能垫蛆,解決2個實際開發(fā)中遇到的問題鞭盟,來講述在Java中如何使用正則涤妒,讓你半小時掌握正則表達式搔扁。
一渣触、Java中如何使用正則
Java中正則相關(guān)類位于java.util.regex包下羡棵,主要使用2個類,如下:
Pattern類:
Pattern是正則表達式regex的編譯表示形式
代碼:Pattern pattern = Pattern.compile(regex);
Matcher類:
通過解釋Pattern對輸入的字符串input執(zhí)行匹配操作的引擎
代碼:Matcher matcher = pattern.matcher(input);
注意:在Java代碼中轉(zhuǎn)義字符“\”要寫成“\\”才表示一個“\”嗅钻。
比如regex=\d皂冰,在Java代碼中應(yīng)該寫成“\\d”。
下面我們通過幾段Java代碼來感受一下养篓,除了功能1的代碼是完整代碼外秃流,其余功能代碼,我只給出main()方法柳弄。
功能1:判斷給定的字符串是否與給定的正則表達式完全匹配
說明:matches()方法舶胀,嘗試將整個區(qū)域與模式匹配。
regex=\w+表示匹配至少一個字母或者數(shù)字或下劃線[a-zA-z0-9_]碧注,所以字符串“HelloWord”與這個正則完全匹配嚣伐。
功能2:判斷給定的字符串是否包含至少一個數(shù)字
說明:find()方法,嘗試查找與該模式匹配的輸入序列的下一個子序列萍丐,如果存在多個子串轩端,find()方法能找到所有符合條件的子串。
regex=\d+表示匹配至少一個數(shù)字逝变,所以字符串“HelloWord,666!”可以匹配這個正則基茵。
功能3:從給定的字符串里找出所有的數(shù)字子串
說明:group()方法奋构,返回在以前匹配操作期間由給定組捕獲的輸入子序列。即通過find()方法找到的符合條件的子串可以通過group()方法獲取耿导。
regex=\d+表示匹配至少一個數(shù)字声怔,字符串“HelloWord,666,888!”可以匹配這個正則2次,通過group()方法獲取到了匹配的數(shù)字666與888舱呻。
功能4:把給定的字符串里的所有數(shù)字替換為星號“*”
說明:replaceAll()方法醋火,替換模式與給定字符串相匹配的輸入序列的每個子序列。即通過replaceAll()方法把符合條件的子串替換成replaceAll()方法中的參數(shù)箱吕。
regex=\d+表示匹配至少一個數(shù)字芥驳,字符串“Beijing 666,China 888!”可以匹配這個正則2次,通過replaceAll(“”)方法把匹配的數(shù)字666與888替換成了**茬高,因此替換后的字符串為“Beijing ***,China ***!”兆旬。
功能5:把給定的字符串通過正則表達式進行拆分
說明:String的split()方法,根據(jù)給定正則表達式的匹配拆分此字符串怎栽。
字符串“Beijing010shanghai021tianjin022@鲡!熏瞄!”可以匹配3次regex=\d+脚祟,通過split()方法按數(shù)字進行拆分,拆分出4組內(nèi)容强饮,分別是“Beijing”, “shanghai”, “tianjin”, “S勺馈!邮丰!”行您。
通過以上5個功能代碼段,對Java開發(fā)中如何使用正則表達式應(yīng)該有了一個較為清晰的認識剪廉。
下面我們再通過2個實際開發(fā)中遇到的問題來進一步說明正則表達式在開發(fā)的使用娃循。
二、利用正則解決2個實際問題
問題1:一鍵獲取短信驗證碼
短信驗證碼在目前的互聯(lián)網(wǎng)應(yīng)用的非常廣泛妈经,在一些重要操作中都需要輸入短信驗證碼來驗證身份信息淮野。
列舉3條不同的驗證碼短信內(nèi)容如下:
1、【膜拜單車】您的驗證碼是5072.請在頁面中提交驗證碼完成驗證吹泡。
2骤星、【大眾點評】876529(大眾點評網(wǎng)手機驗證碼,請完成驗證)爆哑,如非本人操作洞难,請忽略本短信。
3揭朝、【百度】349865(動態(tài)驗證碼)队贱,請在30分鐘內(nèi)填寫色冀。
那么如何通過一個正則表達式來獲取到3個不同類型的短信內(nèi)容里的數(shù)字驗證碼呢?
首先分析以上3條短信內(nèi)容柱嫌,找出共同點:
1锋恬、驗證碼都是數(shù)字,可以是4位數(shù)字编丘,也可以是6位數(shù)字
2与学、每條短信都包含“驗證碼”3個漢字
3、“驗證碼”3個字與數(shù)字的順序關(guān)系嘉抓,“驗證碼”3個字可以在數(shù)字前索守,也可以在數(shù)字后
有了上面的3個點,我們就可以寫在正則工具里寫正則表達式進行驗證了抑片。
1卵佛、4位數(shù)字或者6位數(shù)字,可以用“\d{4}|\d{6}”來匹配敞斋,我們使用捕獲組( )來獲取數(shù)字部分截汪,即regex=(\d{4}|\d{6})
2、驗證碼3個字就用“驗證碼”來匹配植捎,regex=驗證碼
3挫鸽、“驗證碼”3個字在數(shù)字前,可以regex=驗證碼\D(\d{4}|\d{6})鸥跟,“驗證碼”3個字在數(shù)字后,可以regex=(\d{4}|\d{6})\D驗證碼盔沫,這2個表達式是或的關(guān)系医咨,需要用到括號來組織這2個表達式,然后再用或“|”來進行選擇架诞,即regex=(驗證碼\D(\d{4}|\d{6}))|((\d{4}|\d{6})\D驗證碼)
4拟淮、由于要通過捕獲組( )來獲取數(shù)字內(nèi)容,又要用括號來組織關(guān)系谴忧,因此需要把或“|”兩邊的表達式部分用非捕獲組(?:)來標記很泊,因為我們只需要獲取數(shù)字部分的括號( )匹配到的數(shù)字。即regex=(?:驗證碼\D(\d{4}|\d{6}))|(?:(\d{4}|\d{6})\D驗證碼)
最后我們把分析到的表達式代入到Java代碼完成功能沾谓。注意在Java中委造,反斜杠需要轉(zhuǎn)義,即一杠變二杠均驶。
運行結(jié)果如下:
問題2:判斷用戶密碼是否為強密碼
用戶設(shè)置的密碼弱昏兆,會導(dǎo)致信息安全問題,一般的系統(tǒng)都要求設(shè)置強密碼妇穴。
下面是京東注冊頁面的截圖:
以京東注冊為例爬虱,京東建議使用字母隶债、數(shù)字和符號兩種及以上的組合,6-20個字符跑筝。
下面我們通過正則表達式來完成用戶輸入的密碼是否符合密碼規(guī)則的校驗死讹。
首先分析密碼要求,如下:
1曲梗、密碼包括字母赞警、數(shù)字和符號3種字符
2、必須包含2種及以上的字符
3稀并、密碼長度6-20位
字母包括:A-Za-z仅颇,數(shù)字包括:0-9,
符號包括32個:`-=][';/.,~!@#$%^&()_+|}{":?><
需要注意的是如果使用32個符號碘举,特殊字符“\”忘瓦、“[”、“]”是需要進行轉(zhuǎn)義的引颈,為了簡單直觀耕皮,我們假設(shè)符號只有@#$3個。
進一步分析蝙场,密碼只有字母凌停,數(shù)字,符號3種類型的字符售滤,要求必須包含2種及以上罚拟,那么密碼組合的種類有4種(3個里面選2個+3個全選=4),即:
字母+數(shù)字完箩,字母+符號赐俗,數(shù)字+符號,字母+數(shù)字+符號弊知。
如果從正面去考慮這個問題阻逮,那么正則會很難寫,所有我們從反向考慮:“必須包含2種及以上”的反向就是“只包含1種”秩彤,也就是說密碼要求“不能只包含1種字符”叔扼。
密碼長度6-20位,需要用到開始標記“^”和結(jié)束標記“$”漫雷,量詞{6,20}
最終分析密碼要求是:
密碼從開始到結(jié)束必須6-20位而且不能全部是1種單一的字符
因此正則可以這么寫:
regex=^(?![A-Za-z]+$)(?![0-9]+$)(?![@#$]+$)[A-Za-z0-9@#$]{6,20}$
解釋:
^(?![A-Za-z]+$)表示從頭到位不能全是字母
^(?![0-9]+$)表示從頭到位不能全是數(shù)字
^(?![@#$]+$)表示從頭到位不能全是符號@#$
^[A-Za-z0-9@#$]{6,20}$表示從頭到位只能是字母數(shù)字符號@#$的集合
需要注意的是瓜富,開始符“^”和預(yù)搜索“(?!)”都是零寬的,表示位置珊拼,所以開始符“^”只需要在整個正則表達式的開始處寫一個即可食呻。
如果這里看不懂的話,請看半小時學(xué)會正則表達式(上)的相關(guān)內(nèi)容。
最后我們把分析到的表達式代入到Java代碼完成功能仅胞。注意在Java中每辟,反斜杠需要轉(zhuǎn)義,即一杠變二杠干旧。
最終結(jié)果如下:
至此渠欺,正則表達式的所有內(nèi)容介紹完了,相信你已經(jīng)具備了正則開發(fā)的能力椎眯,那么挠将,希望大家在以后的工作中可以使用正則來完成相應(yīng)的工作。
如果想獲取以上的源代碼编整,點擊正則源碼獲取,密碼:r9oa
再次給大家介紹一下開發(fā)中使用正則表達式的流程:
1舔稀、分析所要匹配的數(shù)據(jù)特點,模擬各種測試數(shù)據(jù)掌测;
2内贮、利用正則工具,寫正則表達式與測試數(shù)據(jù)進行匹配汞斧,從而驗證你寫的正則夜郁;
3、在程序里調(diào)用在正則工具中驗證通過的正則表達式粘勒。
在這里給大家推薦一個正則工具“RegexBuddy”竞端,你可以從網(wǎng)上下載,或者在后臺留下你的郵箱庙睡,我看到后會發(fā)送給你事富。
《半小時學(xué)會正則表達式(上)》講述了正則表達式的語法規(guī)則和一些用法說明,詳情參見:半小時學(xué)會正則表達式(上)
謝謝你的閱讀乘陪,如果你覺得有用赵颅,請記得點贊喲。