正則表達式
正則表達式最早是從UNIX系統的工具組件中發展而來的,在JDK 1.4以前如果需要使用到正則表達式的相關定義則需要單獨引入其它的*.jar文件,而從JDK 1.4之後,正則已經默認被JDK所支持,並且提供有java.util.regex開發包,同時針對於String類也進行了一些修改,使其可以有方法直接支持正則處理
範例:使用正則表達式
public class JavaAPIDemo358 {
public static void main(String[] args) {
String str="123";
if(str.matches("\\d+")) { //結構匹配 判斷是否爲多位數字
int num=Integer.parseInt(str);//將字符串轉換爲int型數據類型
System.out.println(num*2);
}
}
}
執行結果
2
15.13.1常用正則標記
java.util.regex.Pattern中
1、字符:匹配單個字符
- a:表示匹配字母a;
- \:匹配轉義字符“\”;
- \t:匹配轉義字符“\t”;
- \n:匹配轉義字符“\n”;
2、一組字符:任意匹配裏面的一個單個字符;
- [abc]:表示可能是字母a,可能是字母b或者是字母c;
- [^abc]:表示不是字母a、字母b、字母c的任意一個;
- [a-zA-Z]:表示全部字母中的任意一個;
- [0-9]:表示全部數字的任意一個;
3、邊界匹配:在以後編寫JavaScript的時候使用正則中要使用到;
- ^:表示一組正則的開始;
- $:表示一組正則的結束;
4、簡寫表達式:每一位出現的簡寫標記也只表示一位; - .:表示任意的一位字符;
- \d:表示任意的一位數字,等價於“[0-9]”;
- \D:表示任意的一位非數字,等價於“[^0-9]”;
- \w:表示任意的一位字母、數字、,等價於“[a-zA-Z0-9]”;
- \W:表示任意的一位非字母、數字、,等價於“[^a-zA-Z0-9]”;
- \s:表示任意的一位空格,例如:\n、\t等;
- \S:表示任意的一位非空格;
5、數量表示:之前的所有正則都只是表示一位,如果要想表示多位,則就需要數量表示。
- 正則表達式?:此正則出現0次或1次;
- 正則表達式*:此正則出現0次、1次或多次;
- 正則表達式+:此正則出現1次或多次;
- 正則表達式{n}:此正則出現正好n次;
- 正則表達式{n,}:此正則出現n次以上;
- 正則表達式{n,m}:此正則出現n ~ m次。
6、邏輯表示:與、或、非
- 正則表達式A正則表達式B:表達式A之後緊跟着表達式B;
- 正則表達式A|正則表達式B:表示表達式A或者是表達式B,二者任選一個出現;
- (正則表達式):將多個子表達式合成一個表示,作爲一組出現。
15.13.2String類對正則的支持
範例:實現字符串替換(刪除非字母與數字)
public class JavaAPIDemo360A {
public static void main(String[] args) {
String str="liliu@#$%";
String regex="[^a-zA-Z0-9]+";
System.out.println(str.replaceAll(regex, ""));
}
}
執行結果
liliu
範例:實現字符串拆分
public class JavaAPIDemo360B {
public static void main(String[] args) {
String str="k555h4448h54f555r44k4";
String regex="\\d+";
String [] result=str.split(regex);
for (int i = 0; i < result.length; i++) {
System.out.print(result[i]+" ");
}
}
}
執行結果
k h h f r k
範例:判斷一個數據是否爲小數,如果是小數則將其轉換double型
public class JavaAPIDemo361A {
public static void main(String[] args) {
String str = "100.1"; // 要判斷的數據內容
String regex = "\\d+(\\.\\d+)?"; // 正則表達式
if (str.matches(regex)) { // 正則匹配成功
double num = Double.parseDouble(str) ; // 字符串轉double
System.out.println(num); // 直接輸出
} else {
System.out.println("內容不是數字,無法轉型。");
}
}
}
執行結果
100.1
範例:判斷一個字符串是否由日期所組成,如果是由日期所組成則將其轉爲Date類型
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class JavaAPIDemo361B {
public static void main(String[] args) throws ParseException {
String str="1998-06-14";
String regex="\\d{4}-\\d{2}-\\d{2}";
if(str.matches(regex)) {
System.out.println(new SimpleDateFormat("yyyy-MM-dd").parse(str));
}
}
}
執行結果
Sun Jun 14 00:00:00 CST 1998
範例:判斷電話號碼格式是否正確
在本程序中電話號碼的內容有如下三種類型:
- 電話號碼類型一(7 ~ 8位數字):51283346(判斷正則:“\d{7,8}”);
- 電話號碼類型二(在電話號碼前追加區號):01051283346(判斷正則:“(\d{3,4})?\d{7,8}”);
- 電話號碼類型三(區號單獨包裹):(010)-51283346(判斷正則:“((\d{3,4})|(\(\d{3,4}\)-))?\d{7,8}”);
public class JavaAPIDemo361C {
public static void main(String[] args) {
String str="(010)-51283346";
String regex="((\\d{3,4})|(\\(\\d{3,4}\\)-))?\\d{7,8}"; // 正則表達式
System.out.println(str.matches(regex));// 正則匹配
}
}
執行結果
true
範例:驗證Email格式
現在要求一個合格的Email地址的組成規則如下:
- email的用戶名可以由字母、數字、所組成(不應該使用“”開頭);
- email的域名可以由字母、數字、_、-所組成;
- 域名的後綴必須是:.cn、.com、.net、.com.cn、.gov;
public class JavaAPIDemo362 {
public static void main(String[] args) throws Exception {
String str = "[email protected]"; // 要判斷的數據
String regex = "[a-zA-Z0-9]\\w+@\\w+\\.(cn|com|com.cn|net|gov)"; // 正則表達式
System.out.println(str.matches(regex)); // 正則匹配
}
}
執行結果
true
15.13.3 java.util.regex包支持
Pattern類的常用方法(正則模式):
Matcher類的常用方法(匹配):
範例:使用Pattern類實現字符串拆分
public class JavaAPIDemo363A {
public static void main(String[] args) throws Exception {
String str = "ll()lia$()java&*()#@Python" ; // 要拆分的字符串
String regex = "[^a-zA-Z]+" ; // 正則匹配標記
Pattern pat = Pattern.compile(regex) ; // 編譯正則表達式
String result [] = pat.split(str) ; // 字符串拆分
for (int x = 0 ; x < result.length ; x ++) { // 循環輸出拆分結果
System.out.print(result[x] + "、");
}
}
}
執行結果
ll、lia、java、Python、
範例:使用Matcher類實現正則驗證
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JavaAPIDemo363B {
public static void main(String[] args) {
String str="101";
String regex="\\d+";
Pattern pat=Pattern.compile(regex);
Matcher mat=pat.matcher(str);
System.out.println(mat.matches());
}
}
執行結果
true
範例:使用Matcher類實現字符串替換
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JavaAPIDemo364 {
public static void main(String[] args) {
String str="ljmfdvsnui$#$%reh!#$%";
String regex="[^a-zA-Z0-9]";
Pattern pat=Pattern.compile(regex);
Matcher mat=pat.matcher(str);
System.out.println(mat.replaceAll(""));
}
}
執行結果
ljmfdvsnuireh
範例:使用Matcher類實現數據分組操作
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class avaAPIDemo364B {
public static void main(String[] args) throws Exception {
// 定義一個語法,其中需要獲取“#{}”標記中的內容,此時就必須進行分組匹配操作
String str = "INSERT INTO dept(deptno,dname,loc) VALUES (#{deptno},#{dname},#{loc})";
String regex = "#\\{\\w+\\}"; // 正則表達式
Pattern pat = Pattern.compile(regex); // 編譯正則表達式
Matcher mat = pat.matcher(str);// 獲取Matcher類實例
while (mat.find()) { // 是否有匹配成功的內容
// 獲取每一個匹配的內容,並且將每一個內容中的“#{}”標記替換掉
String data = mat.group(0).replaceAll("#|\\{|\\}", "") ;
System.out.print(data + "、");
}
}
}
執行結果
deptno、dname、loc、