摘要:正則表達(dá)式是一個(gè)強(qiáng)大的字符串處理工具,可以對字符串進(jìn)行查找提取分隔替換等操作。例如,正則表達(dá)式用于匹配的三個(gè)訪問控制符其中之一邊界匹配符數(shù)量標(biāo)識符貪婪模式數(shù)量表示符默認(rèn)采用貪婪模式。方法以空格為分隔符,將字符串分割成多個(gè)子串哈哈
正則表達(dá)式是一個(gè)強(qiáng)大的字符串處理工具,可以對字符串進(jìn)行查找、提取、分隔、替換等操作。String類里提供了如下幾個(gè)特殊方法
boolean matches(String regex):判斷該字符串是否匹配指定的正則表達(dá)式
String replaceAll(String regex, String replacement):將該字符串中所有匹配regex的子串替換成replacement
String replaceFirst(String regex, String replacement):將該字符串中第一個(gè)匹配regex的子串替換成replacement
String[] split(String regex):以regex為分隔符,把該字符串分割成多個(gè)子串
創(chuàng)建正則表達(dá)式正則表達(dá)式是用于匹配字符串的模板,可以匹配一批字符串,所以創(chuàng)建正則表達(dá)式就是創(chuàng)建一個(gè)特殊的字符串
正則表達(dá)式所支持的合法字符字符 | 解釋 |
---|---|
x | 字符x |
0mnn | 八進(jìn)制數(shù)0mnn所表達(dá)的字符 |
xhh | 十六進(jìn)制數(shù)0xhh所表達(dá)的字符 |
uhhhh | 十六進(jìn)制數(shù)0xhhhh所表達(dá)的Unicode字符 |
t | 制表符("u0009) |
n | 新行(換行)符("u000A) |
r | 回車符("u000D) |
f | 換頁符("u000C) |
a | 報(bào)警(bell)符("u0007) |
e | Escape符("u001B) |
cx | x對應(yīng)的控制符。cM匹配Ctrl-M,x必須為A~Z或a~z |
正則表達(dá)式中的“通配符”遠(yuǎn)遠(yuǎn)超出了普通通配符的功能,被稱為預(yù)定義字符。
用于將多個(gè)表達(dá)式組成一個(gè)子表達(dá)式,圓括號中可以使用或運(yùn)算符(|)。例如,正則表達(dá)式"((public)|(protected)|(prvate))"用于匹配Java的三個(gè)訪問控制符其中之一
邊界匹配符 數(shù)量標(biāo)識符Greedy(貪婪模式):數(shù)量表示符默認(rèn)采用貪婪模式。貪婪模式的表達(dá)式會(huì)一直匹配下去,直到無法匹配
Reluctant(勉強(qiáng)模式):用問號后綴(?)表示,只會(huì)匹配最少的字符,也稱為最小匹配模式
Possessive(占有模式):用加號后綴(+)表示,目前只有Java支持占有模式,通常較少使用
貪婪模式和勉強(qiáng)模式的對比:
String str = "SSR! 大天狗"; //貪婪模式的正則表達(dá)式 System.out.println(str.replaceFirst("w*","□")); //勉強(qiáng)模式的正則表達(dá)式 System.out.println(str.replaceFirst("w*?","□"));
"w"使用了貪婪模式,數(shù)量表示符()會(huì)一直匹配下去,所以該字符串前面的所有單詞 字符都被它匹配到,直到遇到空格,所以替換后的效果是“□! 大天狗”;如果使用勉強(qiáng)模式,數(shù)量表示符(*)會(huì)盡量匹配最少字符,即匹配0個(gè)字符,所以替換后的結(jié)果是“□SSR! 大天狗”。
使用正則表達(dá)式Pattern對象是正則表達(dá)式編譯后在內(nèi)存中的表示形式,因此,正則表達(dá)式字符串必須先被編譯為Pattern對象,然后再利用該P(yáng)attern對象創(chuàng)建對應(yīng)的Matcher對象。執(zhí)行匹配所涉及的狀態(tài)保留在Matcher對象中,多個(gè)Matcher對象可共享同一個(gè)Pattern對象。
典型調(diào)用順序
//將一個(gè)字符串編譯成Pattern對象 Pattern pattern = Pattern.compile("a*b"); //使用Pattern對象創(chuàng)建Matcher對象 Matcher matcher = pattern.matcher("aaaaab"); boolean b = matcher.matches(); //返回true
上面定義的Pattern對象可以多次重復(fù)使用。如果僅需一次使用,則可直接使用Pattern類的靜態(tài)matches()方法,此方法自動(dòng)把指定字符串編譯成匿名的Pattern對象,并執(zhí)行匹配
boolean b = pattern.matches("a*b", "aaaaab"); //返回true
上面語句等效于前面的三條語句,但采用這種語句每次都需要重新編譯新的Pattern對象,不能重新利用已編譯的Pattern對象,所以效率不高
Pattern是不可變類,可供多個(gè)并發(fā)線程安全使用
Matcher類提供的常用方法:
find():返回目標(biāo)字符串中是否包含與Pattern匹配的子串
group():返回上一次與Pattern匹配的子串
start():返回上一次與Pattern匹配的子串在目標(biāo)字符串中的開始位置
end():返回上一次與Pattern匹配的子串在目標(biāo)字符串中結(jié)束位置加1
lookingAt():返回目標(biāo)字符串前面部分與Pattern是否匹配
matches():返回整個(gè)目標(biāo)字符串與Pattern是否匹配
reset():將現(xiàn)有的Matcher對象應(yīng)用于一個(gè)新的字符序列
CharSequence接口,該接口代表一個(gè)字符序列,其中CharBuffer、String、StringBuffer、StringBuilder都是它的實(shí)現(xiàn)類。
通過Matcher()類的find()和group()方法從目標(biāo)字符串中依次取出特定子串(匹配正則表達(dá)式的子串)
import java.util.regex.Matcher; import java.util.regex.Pattern; public class FindGroup { public static void main(String[] args) { //使用字符串模擬從網(wǎng)絡(luò)上得到的網(wǎng)頁源碼 String string = "四洲休閑食品:0754-88117038" + "清風(fēng)牌面巾紙:8008282272" + "統(tǒng)一冰紅茶:4007000660"; //創(chuàng)建一個(gè)Pattern對象,并用它建立一個(gè)Matcher對象 //該正則表達(dá)式只抓取400X和800X段的電話號碼 //實(shí)際要抓取哪些電話號碼,只要修改正則表達(dá)式即可 Matcher matcher = Pattern.compile("((400d)|(800d))d{6}").matcher(string); //將所有符合正則表達(dá)式的子串(電話號碼)全部輸出 while (matcher.find()) { System.out.println(matcher.group()); } } }
find()方法還可以傳入一個(gè)int類型的參數(shù),帶int參數(shù)的find()方法將從該int索引處向下搜索。start()和end()方法主要用于確定子串在目標(biāo)字符串中的位置
import java.util.regex.Matcher; import java.util.regex.Pattern; public class StartEnd { public static void main(String[] args) { //創(chuàng)建一個(gè)Pattern對象,并用它建立一個(gè)Matcher對象 String regStr = "France LoireAtlantique Bretagne Nantes"; System.out.println("目標(biāo)字符串是:" + regStr); Matcher matcher = Pattern.compile("w+").matcher(regStr); while (matcher.find()) { System.out.println(matcher.group() + "子串的起始位置:" + matcher.start() + ",其結(jié)束位置:" + matcher.end()); } } }
目標(biāo)字符串是:France LoireAtlantique Bretagne Nantes France子串的起始位置:0,其結(jié)束位置:6 LoireAtlantique子串的起始位置:7,其結(jié)束位置:22 Bretagne子串的起始位置:23,其結(jié)束位置:31 Nantes子串的起始位置:32,其結(jié)束位置:38
程序創(chuàng)建一個(gè)郵件地址Pattern,再將其與多個(gè)郵寄地址進(jìn)行匹配。當(dāng)程序中的Matcher為null時(shí),程序調(diào)用matcher()方法來創(chuàng)建一個(gè)Matcher對象,一旦Matcher對象被創(chuàng)建,程序就調(diào)用Matcher的reset()方法將該Matcher應(yīng)用于新的字符序列
import java.util.regex.Matcher; import java.util.regex.Pattern; public class MatchesTest { public static void main(String[] args) { String[] mails = { "LeBornJames@gmail.com", "FlashWade@163.com", "Bosh@yahoo.com" }; String mailRegEx = "w{3,20}@w+.(com|org|cn|net|gov|ed)"; Pattern mailPattern = Pattern.compile(mailRegEx); Matcher matcher = null; for (String mail : mails) { if (matcher == null) { matcher = mailPattern.matcher(mail); } else { matcher.reset(); } String result = mail + (matcher.matches() ? "是":"不是") + "一個(gè)有效郵件地址"; System.out.println(result); } } }
Matcher類提供的replaceAll()把字符串中所有與正則表達(dá)式的子串替換成:"呵呵"。還提供replaceFirst(),該方法只替換第一匹配的子串。split()方法以空格為分隔符,將字符串分割成多個(gè)子串
public class StringReg { public static void main(String[] args) { String[] msgs = { "Java has regular expressions in 1.4", "regular expressions now expressing in Java", "Java represses oracular expressions" }; for (String msg : msgs) { System.out.println(msg.replaceFirst("rew*" , "哈哈:)")); System.out.println(Arrays.toString(msg.split(" "))); } } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/66364.html
Javascript的正則表達(dá)式是前端中比較重要的部分,正則表達(dá)式主要用于字符串處理,表單驗(yàn)證等場合,實(shí)用高效,文章主要對JavaScript中的正則的學(xué)習(xí)與總結(jié) 正則表達(dá)式的定義 正則表達(dá)式:是一個(gè)描述字符模式的對象,JavaScrip中正則表達(dá)式用RegExp對象表示,可以使用RegExp構(gòu)造函數(shù)來創(chuàng)建正則對象 正則表達(dá)式的創(chuàng)建 1.字面量創(chuàng)建 var reg = /[a-z]/; 2.構(gòu)...
摘要:正則表達(dá)式的意義中的正則表達(dá)式使用表示,可以使用構(gòu)造函數(shù)來創(chuàng)建對象,不過對象更多的是通過一種特殊的直接量語法來創(chuàng)建。用構(gòu)造函數(shù)也可以定義一個(gè)與之等價(jià)的正則表達(dá)式,代碼如下正則表達(dá)式的模式規(guī)則是由一個(gè)字符序列組成的。 正則表達(dá)式的模式匹配 正則表達(dá)式(regular expression)是一個(gè)描述字符模式的對象。javascript的RegExp對象表示正則表達(dá)式,String和Reg...
摘要:正則表達(dá)式等待匹配的字符這里可以輸入任何繼承了的類返回一個(gè)值說明是否匹配這里需要注意的是,和均不允許通過構(gòu)造器新建一個(gè)對象。 前言 之前一直想要做一個(gè)自己的爬蟲,然后從nba數(shù)據(jù)相關(guān)的網(wǎng)上【虎撲,騰訊,官網(wǎng)等,要視網(wǎng)站是否支持】爬點(diǎn)數(shù)據(jù)寫數(shù)據(jù)分析和圖形化展示。雖然年輕的時(shí)候就實(shí)現(xiàn)過這個(gè)功能,但是當(dāng)時(shí)直接借用了一個(gè)網(wǎng)上現(xiàn)成的jar包,然后在那個(gè)基礎(chǔ)上寫了一個(gè)非常簡陋的正則表達(dá)式來提取數(shù)據(jù)...
摘要:選擇分組和引用正則表達(dá)式的語法還包括指定選擇項(xiàng)子表達(dá)式分組和引用前一子表達(dá)式的特殊字符。帶圓括號的表達(dá)式的另一個(gè)用途是允許在同一正則表達(dá)式的后部引用前面的子表達(dá)式。 正則表達(dá)式(regular expression)是一個(gè)描述字符模式的對象。JavaScript的 RegExp類 表示正則表達(dá)式,String和RegExp都定義了方法,后者使用正則表達(dá)式進(jìn) 行強(qiáng)大的模式匹配和文本檢索與...
摘要:表示進(jìn)行多行匹配。如果正則表達(dá)式中含有子表達(dá)式,那么該數(shù)組后續(xù)的項(xiàng)依次為匹配到的第一個(gè)子表達(dá)式的匹配結(jié)果,第二個(gè)第個(gè)。關(guān)于正則方法有一點(diǎn)必須要提,很容易導(dǎo)致錯(cuò)誤的情況。這時(shí)候直接使用該正則表達(dá)式對進(jìn)行方法調(diào)用,卻返回了。匹配前一項(xiàng)至少次。有人說,一行正則抵得上100行代碼……正則表達(dá)式,每門語言都有,在我們的js開發(fā)中,最常見的使用場景:一是表單驗(yàn)證,像是登錄注冊啊,用戶輸入檢測啊,不管在前...
閱讀 2060·2021-11-23 09:51
閱讀 3353·2021-09-28 09:36
閱讀 1120·2021-09-08 09:35
閱讀 1758·2021-07-23 10:23
閱讀 3258·2019-08-30 15:54
閱讀 2998·2019-08-29 17:05
閱讀 438·2019-08-29 13:23
閱讀 1294·2019-08-28 17:51