黑马程序员-Java基础-正则表达式
------- android培訓(xùn)、java培訓(xùn)、期待與您交流! ----------
一、概述:
正則表達式:符合一定規(guī)則的表達式。
作用:用于專門操作字符串。可以簡化對只付出的復(fù)雜操作。
特點:用于一些特定的符號來表示一些代碼操作。簡化書寫。
弊端:符號定義越多,正則越長,閱讀性越差。
例如:對QQ號進行校驗,要求5~15位,0不能開頭,只能是數(shù)字。
如果用String 類中的組合方法進行校驗:
1 // String類中的方法組合: 2 public static void checkQQ_1(String qq) { 3 int len = qq.length() ; 4 5 if (len > 15 || len < 5) { 6 System.out.println("長度錯誤。"); 7 } 8 else { 9 if (qq.startsWith("0")){ 10 System.out.println("不能以0開頭。"); 11 } 12 else { 13 14 try { 15 long q = Long.parseLong(qq) ; 16 System.out.println("qq:"+q); 17 } 18 catch(NumberFormatException e ) { 19 System.out.println("出現(xiàn)非法字符。"); 20 } 21 } 22 } 23 }但是如果使用正則表達式:
1 // 正則表達式: 2 public static void checkQQ(String qq) { 3 // 定義正則表達式規(guī)則:第一位是1-9中的一個,然后0-9中的數(shù)字出現(xiàn)4-14次。 4 String regex = "[1-9][0-9]{4,14}" ; 5 boolean flag = qq.matches(regex) ; 6 if (flag) 7 System.out.println(qq+":ok"); 8 else 9 System.out.println(qq+":不合法"); 10 }總結(jié):使用正則表達式操作字符串。可以簡化對只付出的復(fù)雜操作。
二、常用正則表達式規(guī)則
字符類?
[abc] a、b 或 c(簡單類)?
[^abc] 任何字符,除了 a、b 或 c(否定)?
[a-zA-Z] a 到 z 或 A 到 Z,兩頭的字母包括在內(nèi)(范圍)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](減去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](減去)?
?
預(yù)定義字符類
. 任何字符(與行結(jié)束符可能匹配也可能不匹配)
\d 數(shù)字:[0-9]
\D 非數(shù)字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 單詞字符:[a-zA-Z_0-9]
\W 非單詞字符:[^\w]?
?
Greedy 數(shù)量詞
X? X,一次或一次也沒有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超過 m 次?
?
邊界匹配器
^ 行的開頭
$ 行的結(jié)尾
\b 單詞邊界
\B 非單詞邊界
\A 輸入的開頭
\G 上一個匹配的結(jié)尾?
\Z 輸入的結(jié)尾,僅用于最后的結(jié)束符(如果有的話)?
\z 輸入的結(jié)尾
三、正則表達式具體操作
1、匹配:?boolean matches(String regex)? 用規(guī)則匹配整個字符串,只要有一處不符合規(guī)則就返回false。
總結(jié):如果只想知道該字符串是對是錯,使用匹配。
練習:匹配手機號碼:通常手機號碼是11位,而開頭一般是13、15、18。
1 public static void checkPhone(){ 2 String phone = "13821918343" ; 3 String regex = "1[358]\\d{9}" ; 4 System.out.println(phone.matches(regex)); 5 }regex 的規(guī)則是:第一個數(shù)字為1,第二個數(shù)字是3、5和8中的其中一個,后面由9個0~9中的數(shù)字組成。
2、切割: String[] split(String regex) ; 按照切割規(guī)則將字符串切割成多個子串。
總結(jié):想要按照自定的方式將字符串變成多個字符串,切割。獲取規(guī)則以外的子串。
3、替換:boolean replaceAll(String regex, String replacement)?使用給定的 replacement 替換此字符串所有匹配給定的正則表達式的子字符串。
總結(jié):想要將已有的字符串變成另一個字符串,則使用替換。
練習:將下列字符串轉(zhuǎn)成:我要學(xué)編程。
?"我我我我...我要...要要要...學(xué)學(xué)..學(xué)編..編編編編編編編....編程.程...程程程..程"
思路:先去掉".",然后將重疊字替換。
1 public static void test_1() { 2 String str = "我我我我...我要...要要要...學(xué)學(xué)..學(xué)編..編編編編編編編....編程.程...程程程..程" ; 3 // 將正則表達式封裝成對象: 4 String regex_1 = "\\.+" ; 5 String regex_2 = "(.)\\1+" ; 6 String str_r = str.replaceAll(regex_1, "") ; 7 System.out.println(str_r); 8 System.out.println(str_r.replaceAll(regex_2, "$1")); 9 }總結(jié):“(.)” 表示將任意字符封裝成組,“\1”表示取第1組。“$1”,也是相當于取第一組的意思。
4、獲取:將字符串中符合規(guī)則的子串取出?
步驟:
??? ? 1、將正則表達式封裝成對象。Pattern p =?Pattern.complite(regex) ;
????? 2、讓正則對象和要操作的字符串相關(guān)聯(lián),獲取正則匹配引擎。Matcher m = p.matcher(string) ;
????? 3、通過引擎對符合規(guī)則的子串進行操作。
四、練習
練習:將IP地址進行地址段順序的排序。 192.223.1.234 102.49.23.13 10.10.10.10 1.1.1.1 8.109.90.30
思路:按照字符串的順序排序。但是前提是要讓它們每一位都是3位。則是在前面補0。
1、按照每一段需要的最多的0進行補齊,所以每一位至少有3位。
2、然后將每一段只保留3位。
3、切割出每一個IP地址,去掉0開頭。
1 public static void test_1() { 2 String str = "192.223.1.234 102.49.23.13 10.10.10.10 1.1.1.1 8.109.90.30" ; 3 // 補齊:最多補2個0; 4 str = str.replaceAll("(\\d+)", "00$1"); 5 System.out.println("補0后:"+str); 6 // 每一段只保留3位; 7 str = str.replaceAll("0*(\\d{3})", "$1") ; 8 System.out.println("去0后:"+str); 9 // 切割 10 String[] ips = str.split(" ") ; 11 // 排序 12 TreeSet<String> ipSet = new TreeSet<String>() ; 13 14 for(String ip : ips) { 15 ipSet.add(ip) ; 16 } 17 // 去掉開頭的0; 18 for(String ip : ipSet) { 19 System.out.println(ip.replaceAll("0*(\\d+)", "$1")); 20 } 21 }
練習:網(wǎng)頁爬蟲:獲取網(wǎng)頁上的郵箱。
即按照自己的規(guī)則,去獲取網(wǎng)頁上面的數(shù)據(jù):網(wǎng)頁爬蟲。
獲取郵箱則要定義郵箱的正則表達式:
較為精確的匹配:\w+@[\w&&[^_]]+(\.[a-zA-z]+)+
相對不太精確的匹配:\w+@\w+(\.\w+)+
1 import java.net.*; 2 import java.util.regex.*; 3 import java.io.*; 4 public class RegexTest2 { 5 public static void main(String[] args)throws Exception { 6 getEmail() ; 7 } 8 public static void getEmail() throws Exception { 9 URL url = new URL("http://tieba.baidu.com/p/2358578408") ; 10 URLConnection conn = url.openConnection() ; 11 BufferedReader bufr = 12 new BufferedReader(new InputStreamReader(conn.getInputStream())) ; 13 // 定義正則規(guī)則,將正則表達式封裝成對象。 14 String regex = "\\w+@[\\w&&[^_]]+(\\.[a-zA-z]+)+" ; 15 Pattern p = Pattern.compile(regex) ; 16 17 String line = null ; 18 while((line=bufr.readLine())!=null) { 19 Matcher m = p.matcher(line) ; 20 while(m.find()) { 21 System.out.println(m.group()); 22 } 23 } 24 } 25 }總結(jié):Matcher 類中封裝了許多對匹配字符的操作。
轉(zhuǎn)載于:https://www.cnblogs.com/jbelial/archive/2013/05/30/3107646.html
總結(jié)
以上是生活随笔為你收集整理的黑马程序员-Java基础-正则表达式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 测试软件测试赢在测试2:中国软件测试专家
- 下一篇: javascript设计模式-模板方法模