Java正則表達(dá)式Pattern和Matcher原理詳解
這篇文章主要介紹了Java正則表達(dá)式Pattern和Matcher原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
基本使用
Scanner中的使用正則表達(dá)式
//Scanner 支持的分組 Scanner cin=new Scanner("red a bbc").useDelimiter("\\s*a\\s*"); System.out.println(cin.next()); System.out.println(cin.next());out: redbbc
等同于下面代碼
//等于 正則 Scanner cin2=new Scanner("red a bbc"); cin2.findInLine("\\s*"); // findLine 允許存在多個,match()為最終需要匹配的字符串 MatchResult result = cin2.match(); for (int i = 0; i < result.groupCount(); i++) { System.out.println(result.group(i)); }
Pattern:
//基本匹配 boolean b = Pattern.matches("a*b", "aaaab"); System.out.println(b);
String的aplit的實現(xiàn)
//按照數(shù)字分割 Pattern p=Pattern.compile("\\d+"); String[] str=p.split("好456456像:0532214是"); for (int i = 0; i < str.length; i++) { System.out.println(str[i]); }
一般使用Pattern.matches(String regex,CharSequence input)是一個靜態(tài)方法,用于快速匹配字符串,該方法適合用于只匹配一次,且匹配全部字符串.
Java代碼示例:
Pattern.matches("\\d+","2223");//返回true Pattern.matches("\\d+","2223aa");//返回false,需要匹配到所有字符串才能返回true,這里aa不能匹配到 Pattern.matches("\\d+","22bb23");//返回false,需要匹配到所有字符串才能返回true,這里bb不能匹配到 Pattern p=Pattern.compile("\\d+"); Matcher m=p.matcher("22bb23"); m.pattern();//返回p 也就是返回該Matcher對象是由哪個Pattern對象的創(chuàng)建的
重點:
matches 方法嘗試將整個輸入序列與該模式匹配。
lookingAt 嘗試將輸入序列從頭開始與該模式匹配。
find 方法掃描輸入序列以查找與該模式匹配的下一個子序列。
// matches()對整個字符串進(jìn)行匹配,只有整個字符串都匹配了才返回true Pattern p=Pattern.compile("\\d+"); Matcher m=p.matcher("22bb23"); m.matches();//返回false,因為bb不能被\d+匹配,導(dǎo)致整個字符串匹配未成功. Matcher m2=p.matcher("2223"); m2.matches();//返回true,因為\d+匹配到了整個字符串 // lookingAt()對前面的字符串進(jìn)行匹配,只有匹配到的字符串在最前面才返回true Pattern p1=Pattern.compile("\\d+"); Matcher m3=p1.matcher("22bb23"); m.lookingAt();//返回true,因為\d+匹配到了前面的22 Matcher m4=p1.matcher("aa2223"); m2.lookingAt();//返回false,因為\d+不能匹配前面的aa // find()對字符串進(jìn)行匹配,匹配到的字符串可以在任何位置. Pattern p2=Pattern.compile("\\d+"); Matcher m5=p2.matcher("22bb23"); m.find();//返回true Matcher m6=p2.matcher("aa2223"); m2.find();//返回true Matcher m7=p2.matcher("aa2223bb"); m3.find();//返回true Matcher m8=p2.matcher("aabb"); m4.find();//返回false
Mathcer.start()/ Matcher.end()/ Matcher.group()
當(dāng)使用matches(),lookingAt(),find()執(zhí)行匹配操作后,就可以利用以上三個方法得到更詳細(xì)的信息.
- start()返回匹配到的子字符串在字符串中的索引位置.
- end()返回匹配到的子字符串的最后一個字符在字符串中的索引位置. 即為最后位置加一
- group()返回匹配到的子字符串
Java代碼示例:
Pattern p=Pattern.compile("\\d+"); Matcher m=p.matcher("aaa2223bb"); m.find();//匹配2223 m.start();//返回3 m.end();//返回7,返回的是2223后的索引號 m.group();//返回2223 Mathcer m2=p.matcher("2223bb"); m2.lookingAt(); //匹配2223 m2.start(); //返回0,由于lookingAt()只能匹配前面的字符串,所以當(dāng)使用lookingAt()匹配時,start()方法總是返回0 m2.end(); //返回4 m2.group(); //返回2223 Matcher m3=p.matcher("2223"); //如果Matcher m3=p.matcher("2223bb"); 那么下面的方法出錯,因為不匹配返回false m3.matches(); //匹配整個字符串 m3.start(); //返回0 m3.end(); //返回3,原因相信大家也清楚了,因為matches()需要匹配所有字符串 m3.group(); //返回2223
說了這么多,相信大家都明白了以上幾個方法的使用,該說說正則表達(dá)式的分組在java中是怎么使用的.
start(),end(),group()均有一個重載方法它們是start(int i),end(int i),group(int i)專用于分組操作,Mathcer類還有一個groupCount()用于返回有多少組.
Java代碼示例:
Pattern p=Pattern.compile("([a-z]+)(\\d+)"); Matcher m=p.matcher("aaa2223bb"); m.find(); //匹配aaa2223 m.groupCount(); //返回2,因為有2組 m.start(1); //返回0 返回第一組匹配到的子字符串在字符串中的索引號 m.start(2); //返回3 m.end(1); //返回3 返回第一組匹配到的子字符串的最后一個字符在字符串中的索引位置. m.end(2); //返回7 m.group(1); //返回aaa,返回第一組匹配到的子字符串 m.group(2); //返回2223,返回第二組匹配到的子字符串
驗證手機號
// 驗證手機號 Pattern compile = Pattern.compile("^[1][3,4,5,7,8][0-9]{9}$"); Matcher matcher1 = compile.matcher("15071089603"); while(matcher1.find()){ System.out.println(matcher1.group()); } /** * 驗證手機號碼 * * 移動號碼段:139、138、137、136、135、134、150、151、152、157、158、159、182、183、187、188、147、182 * 聯(lián)通號碼段:130、131、132、136、185、186、145 * 電信號碼段:133、153、180、189、177 * */ String regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,1,2,5-9])|(177))\\d{8}$";
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringCloud用Zookeeper搭建配置中心的方法
本篇文章主要介紹了SpringCloud用Zookeeper搭建配置中心的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04使用Springboot實現(xiàn)健身房管理系統(tǒng)
這篇文章主要介紹了使用Springboot如何實現(xiàn)健身房管理系統(tǒng),希望對你有所幫助2021-07-07Java并發(fā)工具類Exchanger的相關(guān)知識總結(jié)
今天給大家?guī)淼奈恼率荍ava工具類Exchanger的相關(guān)知識總結(jié),文中有非常詳細(xì)的介紹及代碼示例,對正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下2021-06-06Java8中Lambda表達(dá)式使用和Stream API詳解
這篇文章主要給大家介紹了關(guān)于Java8中Lambda表達(dá)式使用和Stream API的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Java8具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05淺談Java中常用數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)類 Collection和Map
下面小編就為大家?guī)硪黄獪\談Java中常用數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)類 Collection和Map。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09詳解Java中Array和ArrayList的比較和轉(zhuǎn)換
在 Java 編程中,arrays 和 arraylists 都是基本的數(shù)據(jù)結(jié)構(gòu),用來存放數(shù)據(jù)集合,雖然兩者的用途一樣,但是它們的特點極大地影響應(yīng)用的性能和靈活性,本文探討 arrays 和 arraylists 的重要特性,它們各自的強項和弱點,,需要的朋友可以參考下2023-08-08