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