Java 正則表達式的使用

 

正則表達式是一個用於匹配字符串的模板,用於匹配字符串。java

 

 

正則表達式語法

  .  小數點,可匹配\n以外的任何一個字符,要匹配小數點,用\.正則表達式

x  x是某一具體字符,表示匹配該字符spa

\d  匹配0-9之間的一個數字code

\D  匹配\d以外的任一個字符對象

\s  匹配任一個空白,包括空格、製表符、回車符、換行符blog

\S  匹配\s以外的任一個字符內存

\w  匹配任一個單詞字符,包括數字0-9,英文字母大寫26個、小寫26個,下劃線_字符串

\W  匹配\w以外的任一個字符it

\t  製表符編譯

\n  換行符

\r  回車符

以上式子均只匹配一個字符

 

 

\  表示匹配一個正則表達式中的預約義符號,例:\\匹配一個\, \(匹配一個(,   \?匹配一個?

|  表示2項中選擇一項,至關於「或」。例:ab|c表示匹配ac或bc,(ab)|[a-d]表示匹配ab或a-d之間的任一個字符,ab|cd|e表示匹配abd、abe、acd、ace中的任一個。

 

 

()     表示一個子表達式,將此子表達式做爲一個總體來看。要匹配(),用\(    \)

 

 

中括號:

[]  表示匹配指定範圍中的任一個字符,例:[abc]表示匹配a、b、c中的任一個字符。

-  表示範圍,例:[!a-z]表示匹配!、全部小寫字母中的任一個字符

^  表示非,例:[^abc]表示匹配a、b、c以外的任一個字符,[^a-d]表示匹配a、b、c、d以外的任一個字符。要把後面部分當成一個總體來看

&&  表示取交集,例:[a-d&&c-z]至關於[cd],匹配c,d中的任一個字符

中括號只匹配一個字符。要匹配[] ,使用\[  \]

 

 


 

 

 

數量限定

*  0次及以上。匹配*請用\*

+  1次及以上。匹配+請用\+

?  0次或1次

{m}     m次

{m,}  至少m次

{m,n}  至少m次,至多n次。

以上均表示前一個字符、(子)表達式出現的次數

 

 


 

 

 

位置限定

^  行的開頭,放在該部分前面,例:^H   表示匹配H,H要是一行的開頭

$  行的結尾,放在該部分的後面,例:。$      表示匹配。   。要是一行的結尾

\b  單詞的邊界,前邊界就放在該部分的前面,後邊界就放在該部分的後面,例:\bH  表示匹配H,H要是某個單詞的開頭;H\b表示匹配H,H要是某個單詞的結尾。

\B  不是單詞的邊界。不是前邊界就放在該部分的前面,不是後邊界就放在該部分的後面,例:\BH  表示匹配H,H不是某個單詞的開頭;H\B表示匹配H,H不是某個單詞的結尾。

以上均是對一個字符、(子)表達式位置的說明。

 

 


 

 

 

使用正則表達式有兩種方式:

  • 使用String類的方法
  • 使用Pattern+Matcher兩個類。

  

一、使用String類的方法:

boolean  matches(String  regex)    該串中是否有匹配。此方法是整串匹配,即該串整個是regex的一個匹配才返回true。好比"hello".matches("hello")返回true,"hello".matches("he")返回false。

String  replaceFirst(String regex,String replacement)  替換第一個匹配,返回替換後的串。若無匹配,則返回原串。

String  replaceAll(String regex,String replacement)     替換全部的匹配,返回替換後的串。若無匹配,則返回原串。

String[]  split(String regex)    以regex做爲分隔符,把該串分割成多個子串

String  Arrays.toString(String[]  arr)    將String[]鏈接成一個字符串並返回。靜態方法。

 

示例:

 1 package test;  2 
 3 public class Test{  4        public static void main(String[] args){  5               String str="hello world!";  6               System.out.println(str.replaceFirst("h","H"));    //Hello world!  7               //正則表達式是\w,但放在""內,\要轉義爲\\
 8               System.out.println(str.replaceFirst("\\w","H"));    //Hello world!
 9  } 10 }

 

 


 

 

 

二、使用Pattern+Matcher兩個類

Pattern對象是正則表達式編譯後在內存中的表示形式,須要先調用Pattern類的靜態方法compile(String regex)將正則表達式編譯爲Pattern對象:

Pattern  p=Pattern.compile("\\w");       //參數爲正則表達式

 

再使用Pattern對象的matcher(String str)獲取Matcher對象:

Matcher  m=p.matcher("hello world!");      //參數爲字符串(用上面的regex匹配這個字符串)

 

以後就能夠用Matcher對象的方法來匹配該串:

boolean   b=m.matches();       //是否有匹配,這個方法是整串匹配。注意上面是er,這裏是es。

boolean  b=m.find();      //是否有匹配,該串中有匹配就返回true。

String  str=m.replaceFirst(String replacement);     //用指定字符串替換第一個匹配,返回替換後的串

String  str=m.replaceAll(String replacement);     //用指定字符串替換全部匹配,返回替換後的串

 

示例:

 1 package test;  2 
 3 import java.util.regex.Matcher;  4 import java.util.regex.Pattern;  5 
 6 public class Test{  7        public static void main(String[] args){  8               Pattern p=Pattern.compile("\\bhe");  9               Matcher m=p.matcher("hello world!"); 10               System.out.println(m.find());   //true
11               System.out.println(m.matches());   //false
12               System.out.println(m.replaceFirst("He"));   //Hello world!
13               System.out.println(m.replaceAll("He"));   //Hello world!
14  } 15 }

 

上面的Pattern對象能夠重複使用,就是說能夠直接使用這個正則表達式去匹配其它的字符串。

若是某個正則表達式只須要使用一次,能夠這樣:

Boolean  b=Pattern.matches(String regex,String str);      //會把regex編譯成匿名的Pattern對象,並執行匹配

注意:只有matches()方法能夠這樣用。mathces()是Pattern的靜態方法。

 

 


 

 

 

數量匹配模式

一、Greedy(貪婪模式)

數量表示符默認使用貪婪模式匹配,儘量多的匹配字符,除非明確使用其它匹配模式。例:

\w{2,5}     會盡量多的匹配,能匹配5個就匹配5個,不行就4個,再不行就3個........     

 \w?     ?表示匹配0次或1次,會優先匹配1次,沒有才匹配0次。

\w+    +表示匹配1次及以上,優先匹配最屢次。

 

 

二、Reluctant(勉強模式)

儘量少的匹配字符,也稱最小匹配模式。須要在數量表示符後用一個額外的?來講明該部分使用最小匹配模式。例:

\w{2,5}?\w   \w{2,5}?會優先匹配2個

\w??\w        \w?會優先匹配0個

\w+?  會優先匹配1次

?要放在數量表示符後面,才表示前面該部分採用   最小匹配模式。若是?以前無數量表示符,則?表示匹配0個或1個,會採用貪婪模式。

 

 

三、Possessive(佔有模式)

在數量表示符後面用一個額外的+來講明該部分使用佔有模式,不經常使用。

 

 


 

 

 

注意

Java中的正則表達式通常是放在雙引號中的,\須要轉義。例:

\w  對應"\\w"

 

只須要轉義\,其它預約義的符號,好比?、()、*等,不用轉義。

相關文章
相關標籤/搜索