正則表達式
正則表達式本質上是一種字符串操作語法規則,利用它我們能更加靈活地實現字符串的匹配、拆分、替換等操作。
正則標記
所有的正則表達式支持的類都定義在java.util.regex包裏面。這個包裏面定義瞭如下兩個主要的類:
1.Pattern類:主要定義要使用的表達式對象
2.Matcher類:用於進行正則標記與指定內容的匹配操作。
所有可以使用的正則標記都在java.util.regex.Pattern類說明文檔中定義,常用的標記有如下6類:
1.單個字符(數量:1)
- 字符:表示由一位字符組成;
- \\\:表示轉義字符“\”;
- \t:表示一個“\t”符號;
- \n:表示一個“\n”符號;
2.字符集(數量:1)
- [abc]:表示可能是字符a、字符b、字符c中的任意一位;
- [^abc]:表示不是字符a,b、c中的任意一位;
- [a-z]:所有的小寫字母;
- [a-zA-Z]:表示任意的一位字母,不區分大小寫;
- [0-9]:表示任意的一位數字;
3.簡化的字符集表達式(數量:1)
- .:表示任意的一位字符;
- \d:等價於“[0-9]”,屬於簡化寫法;
- \D:等價於“[^0-9]”,屬於簡化寫法;
- \s:表示任意的空白字符,例如:“\t”、“\n”;
- \S:表示任意的非空白字符;
- \w:等價於“[a-zA-Z_0-9]”,表示由任意的字母、數字、_組成;
- \W:等價於“[a-zA-Z_0-9]”,表示不是由任意的字母、數字、_組成;
4.邊界分配
- ^:正則的開始;
- $:正則的結束;
5.數量表達
- 正則?:表示此正則可以出現0次或1次;
- 正則+:表示此正則可以出現1次或1次以上;
- 正則*:表示此正則可以出現0次、1次或多次;
- 正則{n}:表示此正則正好出現n次;
- 正則{n,}:表示此正則出現n次以上(包含n次);
- 正則{n,m}:表示此正則出現n~m次;
6.邏輯運算
- 正則1正則2:正則1判斷完成後繼續判斷正則2;
- 正則1|正則2:正則1或是正則2有一組滿足即可;
- (正則):將多個正則作爲一組,可以爲這一組單獨設置出現的次數。
Pattern類常用方法
No. | 方法名稱 | 類型 | 描述 |
---|---|---|---|
1 | public static Pattern compile(String regex) | 普通 | 編譯正則表達式 |
2 | public String[] split(CharSequence input) | 普通 | 數據全拆分操作 |
3 | public String[] split(CharSequence input,int limit) | 普通 | 數據部分拆分操作 |
4 | public Matcher matcher(CharSequence input) | 普通 | 取得Matcher類對象 |
注意:Pattern類沒有定義構造方法,所以想要取得Pattern類對象,必須利用compile()方法進行正則表達式的編譯操作。同時,因爲在Pattern類中定義的方法,在進行參數接收時接收的都是CharSequence接口對象,所以只要是CharSequence接口的子類都可以進行正則操作。
例:利用Pattern類實現字符串拆分
package Project.Study.PatternClass;
import java.util.Arrays;
import java.util.regex.Pattern;
public class Test1 {
public static void main(String[]args){
String str="hello3232world32!!!";
String regex="\\d+";
Pattern pattern=Pattern.compile(regex); //編譯正則
String[] result =pattern.split(str); //拆分字符串
System.out.println(Arrays.toString(result));
}
}
//結果:
//[hello, world, !!!]
Matcher類常用方法
No. | 方法名稱 | 類型 | 描述 |
---|---|---|---|
1 | public boolean matches() | 普通 | 正則匹配 |
2 | public String replaceAll(String replacement) | 普通 | 全部替換 |
3 | public String replaceFirst(String replacement) | 普通 | 替換首個 |
例:實現字符串驗證操作
package Project.Study.MatcherClass;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test1 {
public static void main(String[]args){
String str="100";
String regex="\\d+";
Pattern pattern=Pattern.compile(regex); //編譯正則
Matcher matcher=pattern.matcher(str); //進行正則匹配
System.out.println(matcher.matches()); //匹配結果
}
}
//結果:
//true
String類對正則的支持
事實上,在實際開發中String類使用得較多,大部分情況下都會使用String類中提供的方法來直接簡化正則操作,只有很少的情況下才會使用Pattern類和Matcher類操作正則。
String類與正則有關的5個操作方法
No. | 方法名稱 | 類型 | 描述 |
---|---|---|---|
1 | public boolean matches(String regex) | 普通 | 正則驗證,使用指定的字符串判斷其是否符合給出的正則表達式結構 |
2 | public String replaceAll(String regex,String replacement) | 普通 | 將滿足正則標記的內容全部替換爲新的內容 |
3 | public String replaceFirst(String regex,String replacement) | 普通 | 將滿足正則標記的首個內容替換爲新的內容 |
4 | public String[] split(String regex) | 普通 | 按照指定的正則標記進行字符串的全拆分 |
5 | public String[] split(String regex,int limit) | 普通 | 按照指定的正則標記進行字符串的部分拆分 |
上面5個方法包括字符串的替換、拆分、驗證操作,下面我們就來實現一下
例:實現字符串的替換
package Project.Study.Regex;
public class Test1 {
public static void main(String[]args){
String str="hel12l32o232121wQo@#rl32d!!!";//給出一組混亂的字符串
String regex="[^a-z]"; //編寫正則,剔除所有不是小寫字母的字符
System.out.println(str.replaceAll(regex,""));//字符串替換
}
}
//結果:
//helloworld
例:字符串的拆分
package Project.Study.Regex;
public class Test2 {
public static void main(String[]args){
String str="hello090world3241!!!";
String regex="\\d+"; //表示"[0-9]"一位以上的整數位,屬於簡化寫法,因爲是在字符串中定義的,所以用"\\"代替"\",屬於轉義字符操作
String[] result =str.split(regex);
for (String s : result) {
System.out.println(s); //輸出分隔好的字符串
}
}
}
//結果:
//hello
//world
//!!!
正則驗證的應用
若是字符串是帶小數點".“的數字呢(小數點”."在正則中表示任意字符),我們又應該怎麼將其轉換爲浮點型數據?
例:將字符型數字轉換爲浮點型數據
package Project.Study.Regex;
public class Test3 {
public static void main(String[]args){
String str1="10.01";
String str2="10.10";
String regex="\\d+(\\.\\d+)?";
if(str1.matches(regex)){ //轉型前要進行驗證
System.out.println(Double.parseDouble(str1));
}
if(str2.matches(regex)){ //轉型前要進行驗證
System.out.println(Double.parseDouble(str2));
}
}
}
//結果:
//10.01
//10.1
上程序中的正則解析:
上程序中的"?"表示該小數位可能出現0次或1次。
上程序中使用了matches()方法進行正則驗證,同理,我們也可以用它來判斷其他,例如:IP地址
例:
package Project.Study.Regex;
public class Test4 {
public static void main(String[]args){
String str1="192.168.1.1";
String str2="192.1683.1.1";
String regex1="\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}";//該正則中的"\\d{1,3}"表示1~3位數字
String regex2="(\\d{1,3}\\.){3}\\d{1,3}"; //簡化正則操作
System.out.println(str1.matches(regex1));
System.out.println(str1.matches(regex2));
System.out.println(str2.matches(regex1));
System.out.println(str2.matches(regex2));
}
}
//結果:
//true
//true
//false
//false
例:判斷日期格式是否正確
package Project.Study.Regex;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test5 {
public static void main(String[]args) throws ParseException {
String str="2013-8-15";
String regex="\\d{4}-\\d{1,2}-\\d{1,2}"; //定義驗證正則
if(str.matches(regex)){ //符合規則
Date date=new SimpleDateFormat("yyyy-MM-dd").parse(str);
System.out.println(date);
}
}
}
//結果:
//Thu Aug 15 00:00:00 CST 2013