1、正則表達式語法: ...
正則表達式是一個用於匹配字元串的模板,用於匹配字元串。
正則表達式語法:
. 小數點,可匹配\n之外的任何一個字元,要匹配小數點,用\.
x x是某一具體字元,表示匹配該字元
\d 匹配0-9之間的一個數字
\D 匹配\d之外的任一個字元
\s 匹配任一個空白,包括空格、製表符、回車符、換行符
\S 匹配\s之外的任一個字元
\w 匹配任一個單詞字元,包括數字0-9,英文字母大寫26個、小寫26個,下劃線_
\W 匹配\w之外的任一個字元
\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兩個類。
1、使用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 }
2、使用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的靜態方法。
數量匹配模式:
1、Greedy(貪婪模式):數量表示符預設使用貪婪模式匹配,儘可能多的匹配字元,除非明確使用其它匹配模式。例:
\w{2,5} 會儘可能多的匹配,能匹配5個就匹配5個,不行就4個,再不行就3個........
\w? ?表示匹配0次或1次,會優先匹配1次,沒有才匹配0次。
\w+ +表示匹配1次及以上,優先匹配最多次。
2、Reluctant(勉強模式):儘可能少的匹配字元,也稱最小匹配模式。需要在數量表示符後用一個額外的?來說明該部分使用最小匹配模式。例:
\w{2,5}?\w \w{2,5}?會優先匹配2個
\w??\w \w?會優先匹配0個
\w+? 會優先匹配1次
?要放在數量表示符後面,才表示前面該部分採用 最小匹配模式。如果?之前無數量表示符,則?表示匹配0個或1個,會採用貪婪模式。
3、Possessive(占有模式),在數量表示符後面用一個額外的+來說明該部分使用占有模式,不常用。
註意:
Java中的正則表達式一般是放在雙引號中的,\需要轉義。例:
\w 對應"\\w"
只需要轉義\,其它預定義的符號,比如?、()、*等,不用轉義。