---------- android培訓、java培訓、期待與您交流! ----------
一、概述
1、 概念:符合一定規則的表達式。
2、 作用:用于專門操作字符串。
3、 特點:用一些特定的符號來表示一些代碼操作,這樣可以簡化書寫。
4、 好處:可以簡化對字符串的復雜操作。
5、 弊端:符合定義越多,正則越長,閱讀性越差。
二、常見規則
1、字符類
[abc]:表示a、b或 c
[^abc]:表示任何字符,除了 a、b或 c
[a-zA-Z]:表示a到 z或 A 到 Z
[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](減去)
2、預定義字符
. : 任何字符(與行結束符可能匹配也可能不匹配)
/d:數字:[0-9]
/D:非數字: [^0-9]
/s:空白字符:[ /t/n/x0B/f/r]
/S:非空白字符:[^/s]
/w:單詞字符:[a-zA-Z_0-9]
/W:非單詞字符:[^/w]
3、邊界匹配符
^:行的開頭
$ :行的結尾
/b:單詞邊界
/B:非單詞邊界
/A:輸入的開頭
/G:上一個匹配的結尾
/Z:輸入的結尾,僅用于最后的結束符(如果有的話)
/z:輸入的結尾
4、Greedy數量詞
X? :X出現一次或一次也沒有
X*:X出現零次或多次
X+: X出現一次或多次
X{n}:X恰好 n次
X{n,}:X至少 n次
X{n,m}X:至少 n次,但是不超過 m 次
5、組和捕獲
捕獲組可以通過從左到右計算其開括號來編號。例如,在表達式 ((A)(B(C)))中,存在四個這樣的組:
1 ((A)(B(C)))
2 /A
3 (B(C))
4 (C)
組零始終代表整個表達式,在替換中常用$匹配組的內容。
三、正則表達式常見功能
正則表達式常見功能,主要有四種:匹配、切割、替換和獲取
1、匹配
String類中的boolean matches(String regex)方法。用規則匹配整個字符串,只要有一處不符合規則,就匹配結束,返回false。
2、切割
String類中的String[] split(String regex)方法。
3、替換
String replaceAll(String regex , String replacement)方法。示例:
String str = “zhangsantttxiaoqiangmmmzhan”
str = str.replaceAll(“(.)//” , );
4、獲取
獲?。菏菍⒆址蟹弦巹t的子串取出。
操作步驟:
(1)將正則表達式封裝成對象。Pattern p = Pattern.compile(regex);
(2)讓正則對象和要操作的字符串相關聯。Matcher m = p.matcher(str);
?。?)關聯后,獲取正則匹配引擎。
(4)通過引擎對符合規則的子串進行操作,例如查找、取出。m.find()、m.group();
四、正則表達式應用練習
練習1:字符串轉換
1 /* 需求:將下列字符串轉成:我要學編程 2 "我我...我..我要...要...要要....學學....學學學......編編編...程...程程...." 3 4 思路: 5 將已有字符串變成另一個字符串。使用替換功能。 6 1、可以先將 . 去掉。 7 2、再將多個重復的內容變成單個內容。 8 */ 9 class ReplaceTest{10 public static void main(String[] args){11 String s = "我我...我..我要...要...要要....學學....學學學......編編編...程...程程....";12 System.out.PRintln(s);13 14 String regex = "http://.+";//先將 . 去掉15 s = s.replaceAll(regex,"");//去掉 .16 System.out.println(s);17 18 regex = "(.)//1+";//將重復的內容變成單個內容19 s = s.replaceAll(regex,"$1");//去重20 System.out.println(s);21 }22 }練習2:將ip地址進行地址段順序的排序。
1 /* 需求:將ip地址進行地址段順序的排序。 2 192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.301 3 4 思路: 5 還按照字符串自然順序,只要讓他們每一段都是3位即可。 6 1、按照每一段需要的最多的0進行補齊,那么每一段就會至少保證有3位。 7 2、將每一段只保留3位。這樣,所有的ip地址都是每一段3位。 8 */ 9 import java.util.*;10 class IPSortTest{11 public static void main(String[] args){12 String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.301";13 System.out.println(ip);14 15 String regex = "(//d+)";16 ip = ip.replaceAll(regex,"00$1");//保證每段至少都有三位-------------17 System.out.println(ip);18 19 regex = "0*(//d{3})";20 ip = ip.replaceAll(regex,"$1");//每段只保留三位21 System.out.println(ip);22 23 regex = " ";24 String[] arr = ip.split(regex);//按照空格切25 26 //定義一個TreeSet集合,利用元素自然排序27 TreeSet<String > ts = new TreeSet<String>();28 for (String str : arr ){29 ts.add(str);//添加30 }31 regex = "0*(//d)";//把每段前面多余的0替換掉32 for (String s : ts){33 System.out.println(s.replaceAll(regex,"$1"));//把每段前面多余的0替換掉34 }35 }36 }練習3:郵件地址校驗
1 //需求:對郵件地址進行校驗。 2 class CheckMail{ 3 public static void main(String[] args){ 4 String mail = "123a809bc@sina.com.cn"; 5 String regex = "http://w+@[a-zA-Z0-9]+(//.[a-zA-Z]+){1,3}";//較為精確 6 regex = "http://w+@//w+(//.//w+)+";//相對不太精確的匹配。 7 boolean b = mail.matches(regex); 8 System.out.println(b); 9 }10 }練習4:網絡爬蟲
/* 網絡爬蟲實際上是一個功能,用于搜集網絡上的指定信息需求:可用于收集郵箱,QQ號等之類的信息。*/import java.net.*;import java.util.regex.*;import java.io.*;class Spider{ public static void main(String[] args)throws Exception{ //getFileMail(); getWebMail(); } //獲取網頁中mail public static void getWebMail()throws Exception{ //封裝網頁地址 URL url = new URL("http://tieba.baidu.com/p/1390896758"); //連接服務器 URLConnection conn = url.openConnection(); //帶緩沖區的網頁讀取流 BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line = null; //定義匹配郵件地址的正則表達式 String regex = "http://w+@//w+(//.//w+)+"; Pattern p = Pattern.compile(regex);//封裝正則表達式 //讀取網頁數據 while ((line = br.readLine())! = null){ //正則關聯數據 Matcher m = p.matcher(line); //尋找匹配郵箱 while (m.find()){ System.out.println(m.group());//輸出匹配郵箱 } } } //獲取指定文檔中的郵件地址。使用獲取功能。Pattern Matcher public static void getFileMail()throws Exception{ //將文件封裝成對象 File file = new File("E://Java Study//Practice//day25//mail.txt"); //創建帶緩沖區的讀取流 BufferedReader br = new BufferedReader(new FileReader(file)); String line = null; //定義正則表達式 String regex = "http://w+@[a-zA-Z]+(//.[a-zA-z]+)+"; //創建Pattern對象,封裝正則表達式 Pattern p = Pattern.compile(regex); //讀取文件中數據 while ((line = br.readLine())! = null){ //關流字符串 Matcher m = p.matcher(line); while (m.find())//尋找匹配的字符串{ System.out.println(m.group());//輸出匹配的字符串 } } }}
---------- android培訓、java培訓、期待與您交流! ----------
新聞熱點
疑難解答