java 正則表達式

本文學習並總結java中正則表達式語法及其具體功能。使用正則表達式可以非常方便靈活地操作字符串,在實際項目開發中也很實用。

正則表達式
符合一定規則的表達式。
作用:用於專門操作字符串。
特點:用一些特定符號來表示一些代碼操作,這樣就可以簡化書寫;學習正則表達式就是在學習一些特殊符號的使用。

基本正則表達式語法
下面這些基本正則表達式及語法以jdk 1.6手冊中都有,這裏記錄在這,以方便可以網絡方式查閱。

字符類:[ ]代表一個字符位上出現的字符
[abc]:a、b或c
[^abc]:任何字符,除了a、b或c
[a-zA-Z]:a到z或A到Z的任何字符,包含2頭的字母在內
[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]

預定義字符類
.(一個點):任意字符
\d:數字,相當於[0-9]
\D:非數字,[*0-9]
\s:空白字符,[\t\n\x0B\f\r],\f是換頁符,\xhh指帶有十六進制值的字符hh
\S:非空白字符,[^\s]
\w:單詞字符,[a-zA-Z0-9]
\W:非單詞字符
java中反斜槓'\'有轉義作用,會將後面緊跟的字符轉義,所以上面預定義字符(除.)使用時,前面還要再一個反斜槓,表示r後面是一個整體,不轉義。

邊界匹配器
^:行的開頭
$:行的結尾,\n、\r、\r\n、\u0085、\u2028(行分隔符)、\u2029(段落分隔符)都被認爲是行結束符
\b:單詞邊界
\B:非單詞邊界
\A:輸入的開頭
\G:上一個匹配的結尾
\Z:輸入的結尾,僅用於最後的結束符(如果有的話)
\z:輸入的結尾

數量詞
X?:X出現一次或一次也沒有
X*:X出現零次或多次
X+:X出現一次或多次
X{n}:X出現恰好n次
X{n,}:X出現至少n次
X{n,m}:X出現至少n次,但不超過m次。

正則表達式組
()括起來的代表一個正則表達式組,組的出現都有編號,從1開始,想要使用已有的組,可通過\n(n是組的編號)的形式來獲取。
((A)(B(C)))表達式裏有4個組:
1-((A)(B(C)))
2-\A
3-(B(C))
4-(C)
組零使用代表整個字符串。

正則表達式功能及用法

1. 匹配

boolean matches(String regex),String類中的方法,用規則匹配整個字符串,只要有一處不符合規則,就匹配結束,返回false。
常用的匹配正則表達式
QQ號:[0-9]\\d{4,14}

手機號:1[358]\\d{9}
疊詞:(.)\\1+
郵件:較爲精確的匹配:[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+
           相對不太精確的匹配:\\w+@\\w+(\\.\\w+)+

2. 切割
String[] split(String regex),String類中的方法。
用空格切割時,正則表達式使用“ +”,可用於切割英文句子中的單詞
用.來切割時,需要使用"\\.",可用於切割IP地址、英文全名等。

3. 替換
String replaceAll(String regex, String replacement),將滿足正則表達式的所有子串替換成replacement代表的字符串,返回替換後的字符串。
將多個疊詞替換成單個字母:replaceAll("(.)\\1+",”$1“),用$在外部獲取前一個正則表達式中的組。

4. 獲取
將字符串中符合規則的子串取出。
操作步驟:
(1) 將正則表達式封裝成對象
(2) 將正則對象和要操作的字符串相關聯
(3) 關聯後,獲取正則匹配引擎
(4) 通過引擎對符合規則的子串進行操作,比如取出

/*
需求:取出字符串中長度爲4的單詞
*/
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo {
	public static void main(String[] args) {
		getDemo();
	}
    public static void getDemo(){
    	String str="this is a brand new day, guys have your fun!";
    	String reg="\\b[a-z]{4}\\b";
    	//將規則封裝成對象
    	Pattern p=Pattern.compile(reg);
    	//讓正則對象與要操作的字符串相關聯,獲取匹配器對象
    	Matcher m=p.matcher(str);
    	//先匹配,將規則作用到字符串上,並進行符合規則的子串查找
    	while(m.find()){
    		//獲取匹配後的結果
    		System.out.println(m.group());
    		//打印每個匹配的子串在整個字符串的開關索引和結尾索引
    		System.out.println(m.start()+"....."+m.end());
    	}
    }
}
/*
運行結果:
this
0.....4
guys
25.....29
have
30.....34
your
35.....39
*/

這裏簡單介紹下上面代碼中用的Matcher 匹配器類
無構造函數,類中有靜態方法matcher()可以獲取匹配器對象。
Matcher類有多個匹配字符串的操作方法,可以查閱jdk API手冊,這裏不再一一列出。
boolean matches(),將整個字符串與規則匹配,與String類中的matches方法類似;實際String類中的matches方法用的就是Pattern和Matcher對象來完成的,只不過被String封裝後用起來較爲簡單,但功能卻較爲單一。
Matcher類中也有replaceAll()方法,Stirng類的replaceAll()方法也是使用了此方法。
Match類中還有方法可以獲取匹配子串在整串中的索引:
int start(),返回上一個匹配的子串的初始索引。
int end(), 返回上一個匹配的子串的末尾索引(含頭不含尾,子串中沒有不包含該方法返回索引的字符)。

使用正則表示的示例代碼:

1. 去掉小數後多餘的0

/** 
     * 使用java正則表達式去掉多餘的.與0 
     * @param s 
     * @return  
     */  
    public static String subZeroAndDot(String s){  
        if(s.indexOf(".") > 0){  
            s = s.replaceAll("0+?$", "");//去掉多餘的0  
            s = s.replaceAll("[.]$", "");//如最後一位是.則去掉  
        }  
        return s;  
    }  

正則表達式使用思考方式:
1. 如果只想知道該字符的對錯,使用匹配
2. 想要將已有的字符串變成另一個字符串,使用替換
3. 想要按照自定義的方式將字符串變成多個字符串,使用切割,得到的是規則以外的子串
4. 想要拿到符合需求的字符串子串,使用獲取,得到的是符合規則的子串。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章