正則表示式淺談
對於字串,最常用的就是String類,我們通過String類所提供的各種方法進行操作字串,而且,String所提供的方法本身已經很豐富了,可以滿足很多情況下的使用需求。但是總有一些情況下,使用傳統的String類的方法會使得問題比較難以解決,就比如說郵箱校驗,使用傳統的方法會使得問題的複雜度大大增加,這個時候,就要使用一種很強的工具了,那就是正則表示式。
正則表示式可以幫助我們按照一定的模式,對我們想要操作的字串進行匹配,就比如說我想要在一個大文字中,尋找一個滿足你是XXX,你可以幫我下嗎?的所有子字串,通過正則表示式就可以很方便的實現匹配。說了這麼多,下面來進入正題。
正則表示式的字元:
. | 所有字元 |
---|---|
[abc] | 包含了a,或者b,或者c的任何字元 |
[^abc] | 除了a,b,c之外的任何字元相當於非操作 |
[a-zA-Z] | 從a到z或者A到Z的任何字元 |
\s | 空白符 |
\S | 非空白符,相當於[^\S] |
\d | 數字 |
\D | 非數字,相當於[^\D] |
\w | 詞字元,相當於[a-zA-Z0-9] |
\W | 非詞字元 |
以上就是常用的正則表示式的字元表示。除了這些表示之外,我們還可以通過使用轉義符\來使用一些其他的特殊字元,就比如說是雙引號\\",<,>....
,等等,都可以在正則表示式裡使用,這裡列舉的不全,具體可以到使用的時候參考官方文件。
在這裡有一點需要注意,那就是我們在java的正則表示式裡,如果想要插入一個\
的話,就必須使用\\\\
,這就是Java正則表示式和其他語言的正則表示式不一樣的地方,在其他的語言裡,\\
表示就是我需要在這裡插入一個\
\\
表示這是插入一個反斜槓,這個反斜槓後面的字元有特殊含義,所以,\w
在Java中,因該是\\w
。詳細的正則表示式的編寫可以等遇到具體的情況時具體看。
正則表示式中的量詞用來描述正則表示式匹配的方式,有三種常用的量詞,分別是
*
,+
,?
,這三種。*表示前面的表示式匹配零次或者多次,+表示前面的表示式匹配一次或者多次,最少匹配一次,?表示前面的表示式要麼匹配一次,要麼匹配零次,其中?通常用來和前面兩種搭配使用。除了這三種以外,還有一種指定匹配次數的方式,那就是{n},{n,m},{n,},我們可以利用這種形式來指定前面的正則表示式匹配n次,匹配次數大於等於n,小於m次,至少匹配n次。正則表示式
[]
與()
的區別:方括號用於單個匹配,就是說當匹配當這個位置的時候,它的值只能是方括號裡的其中一個,不能是兩個或者多個,舉個例子,
[abc]
就是在該位置的字元只能是a或者是b或者是c,圓括號是組匹配,意思是當匹配到該位置的時候,從該位置開始,接下的幾位都必須和圓括號裡的規則相匹配,舉個例子就是(abc)
,從該位置開始,連續三個字元必須是abc。對於正則表示式的使用,String類為我們提供了split()方法,可以按照我們輸入的正則表示式對字串進行擷取,Java為我們提供了專門的類庫,regex類庫,它裡面有兩個類,Pattern類和Matcher類。通過這兩個類就可以利用正則表示式來對字串進行各種騷操作了。
//這個方法可以按照輸入的正則表示式對字串進行匹配並且返回匹配到的最大子字串
//該方法可以作為一個模板
private String matchString(String regex,String s) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
if(m.find()) {
String str = m.group();
return str;
}
return null;
}
上面的程式碼就是Pattern和Matcher類的使用模板,可以參考官方文件。至於兩個類中的常用方法可以參考官方api,或者別的部落格,大佬都有很多整理好的資料,這裡就不再貼了,或者我後面再慢慢補充。如有錯誤,請多擔待,後面還會持續的修改補充。
++++++++++++++++++分割線/補充內容++++++++++++++++++++++++++++++++++
對於正則表示式的三種匹配方式,最近因為寫指令碼的原因,發現這是一個我遺漏的重點。正則表示式的匹配,我們通常的做法是直接使用find()
方法來進行判斷,但是對於find()
方法來說,它會在字串的任意位置去匹配這個正則表示式,只要有一個地方符合,就會返回true,但是有些情況下,我們可能需要的是特定位置的匹配,就比如我最近指令碼中需要對xml檔案解析,解析節點的時候,就需要匹配整個字串,而不是其中的某一部分,所以find()
方法就不適用了,我採用了matches()
方法。
下面就是三種匹配方式:
find() | 可以在輸入的任意位置匹配正則 |
---|---|
matches() | 匹配整個輸入的字串,只有整個字串匹配才返回true |
lookingAt() | 只要輸入的第一部分匹配就會返回true |
這樣我們就可以在實際的使用當中,根據我們的需求,選擇合適的匹配方式來匹配。