正則表達式
1、正則表達式定義
正則表達式(Regular Expression)由字母和符號組成的具有特定意義的公式,用於匹配或檢索符合條件的字符串。
例如 在網頁上輸入用戶名,要求用戶名必須由數字,字母,下划線,或者長度必須8-16位之間 像這樣的滿足條件的公式,都是編寫的 正則表達式進行驗證。
^[a-zA-Z0-9_]{8,16}$
解釋: ^ :表示以指定的字符開頭
$:以指定符合結尾
[ a-zA-Z]: 字符必須是這個a-z或 A-Z之間的一個字符
{8,16}:匹配前面的字符8次到16次之間
正則表達式不屬於某一門編程語言,可以在很多語言中使用, 例如 Java ,Python 、JS、MySql
Java提供對正則表達式的支持,有如下類
a、java.util.regex.Pattern 正則表達式的編譯器類
b、java.util.regex.Matcher 正則表達式的匹配器
c、java.lang.String 中的方法自動兼容 正則語法
1、 元字符
元字符是組成正則表達式的最基本的符號 ,通常代表一定意義
元字符 | 解釋 |
---|---|
. | 匹配任意一個字符 |
\w | 匹配一個數字,字母,_ 或漢字 \W :對\w取反 |
\d | 匹配一個數字 \D:對\d取反 |
\s | 匹配一個空白字符 \S:對\s取反 |
\b | 匹配以什么字符開頭 |
^ | 以指定的字符串開頭 ,用於正則開始的標志位 |
$ | 以指定的字符串結尾,用於正則結束的標志位 |
- 匹配以abc開頭的字符串
^abc 或者 \babc
2、匹配8位數的QQ號碼
^\d\d\d\d\d\d\d\d$ 或 ^\d{8}$
3、匹配以1開頭的手機號
^1\d\d\d\d\d\d\d\d\d\d$
String s ="abc";
System.out.println(s.matches("abc"));
System.out.println(s.matches("^abc"));
s="6";
System.out.println(s.matches("\\d"));
s="123456780";
System.out.println(s.matches("\\d{8}"));
區間段
//[x] :表示匹配一個字符
//[abc]:表示匹配a或b或c 一個字符
System.out.println("a".matches("[abc]"));
System.out.println("b".matches("[abc]"));
//[^abc]:匹配不是 a 或b 或c
System.out.println("b".matches("[^abc]"));
// [0-9]:匹配任意一個數字
System.out.println("4".matches("[0-9]"));
重復限定符
正則表達式中用於匹配重復次數的符號
重復限定符 | 意義 |
---|---|
* | 匹配前一個字符0次或多次 |
? | 匹配前一個字符0次或1次 |
+ | 匹配前一個字符1次或多次 |
{n} | 匹配前一個字符n次 |
{n,} | 匹配前一個字符至少n次 |
{n,m} | 匹配前一個字符n到m次(包含n次,m次) |
轉義
如果要匹配的字符串中本身就包含小括號,那是不是沖突?應該怎么辦?
針對這種情況,正則提供了轉義的方式,也就是要把這些元字符、限定符或者關鍵字轉義成普通的字符,做法很簡 答,就是在要轉義的字符前面加個斜杠,也就是\即可。 如:要匹配以(ab)開頭:
或條件
回到我們剛才的手機號匹配,我們都知道:國內號碼都來自三大網,它們都有屬於自己的號段,比如聯通有 130/131/132/155/156等號段,假如讓我們匹配一個聯通的號碼,那按照我們目前所學到的正 則,應該無從下手的,因為這里包含了一些並列的條件,也就是“或”,那么在正則中是如何表示“或”的呢? 正則用符號 | 來表示或,也叫做分支條件,當滿足正則里的分支條件的任何一種條件時,都會當成是匹配成 功。
那么我們就可以用或條件來處理這個問題
// 創建匹配格式的編譯器
String phone ="13388880000";
Pattern pattern = Pattern.compile("1[356789][0-9]{9}");
// 根據編譯器獲取匹配器
Matcher matcher = pattern.matcher(phone);
System.out.println("是否匹配目標字符串:"+matcher.matches());
// 或者簡寫 匹配年齡 (0-100 01-09 | 10-99 |100)
boolean flag = Pattern.matches
("(0?[0-9])|([1-9][0-9])|(100)","10");
System.out.println(flag);
// 匹配一個特殊字符
// 匹配一個字符串中是否包含 .
String s2 ="adb";
System.out.println(s2.matches(".*b.*"));
// 因為.表示的所有字符 當匹配.時,需要轉義
System.out.println(s2.matches(".*\\..*"));
// 對於特殊符號 需要轉義 \\
// 匹配郵箱 包含 任意字符任意個數@域名.com
// .cn .com.cn .gov .net
String email="1@softeem.com";
System.out.println(email.matches("\\w+@\\w+(\\.[a-z]{2,3}){1,2}"));
// 匹配一級網址 http:// https://d
String url="http://www.baidu.com";
System.out.println(url.matches("https?://www\\.\\w+\\.[a-z]{2,3}"));
// 匹配生日格式 1900-13-01 ~ 2099-12-31 01 -31
String birthday="1998-13-10"; // yyyy-MM-dd
String regexp="((19)|(20))[0-9]{2}-((0[0-9])|(1[0-2]))-((0[1-9])|([1-2][0-9])|(3[0-1]))";
System.out.println(birthday.matches(regexp));
匹配漢字
// 匹配漢字
String uname ="張";
System.out.println(uname.matches("[\\u4E00-\\u9FFF]+"));
枚舉類(enum)
1、枚舉類型的誕生
在JDK5以前,定義常量需要使用public fiinal static.. 單獨定義,如果有一組常量,需要定義一組final修飾的類型。這樣會很繁瑣,JDK5以后推出枚舉類型。 可以將一組常量定義一個自定義類,使用是通過該類型直接方法。
2、 枚舉類型的語法
public enum 枚舉類型名稱{
值1,值2,值3...
}
訪問時: 枚舉類型名稱.值1
用法1:
public enum Color {
RED(),YELLOW(),BLUE();
}
public static boolean isRedColor(Color color){
if(color.equals(Color.RED)){
return true;
}
return false;
}
public static void main(String[] args) {
System.out.println(isRedColor(Color.BLUE));
System.out.println(isRedColor(Color.RED));
}
用法2: 定義枚舉類的屬性 並賦值
public enum PROVINCES {
//枚舉的值 在初始化枚舉值時,通過構造器給它的屬性賦值
HB("湖北",0),BJ("北京",1),HN("湖南",2),FJ("福建",3);
//枚舉的屬性
private String provinceName;
private int index;
//枚舉的構造器
private PROVINCES(String provinceName,int index){
this.provinceName= provinceName;
this.index = index;
}
public String getProvinceName() {
return provinceName;
}
public void setProvinceName(String provinceName) {
this.provinceName = provinceName;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
public class Test1 {
public static void main(String[] args) {
System.out.println(isRedColor(Color.BLUE));
System.out.println(isRedColor(Color.RED));
//輸出某一枚舉的值 name和 index
System.out.println(PROVINCES.BJ.getProvinceName());
System.out.println(PROVINCES.BJ.getIndex());
//遍歷所有的枚舉的值
PROVINCES [] provs = PROVINCES.values();
for(PROVINCES pro : provs){
System.out.println(pro.getIndex()+"---"+pro.getProvinceName());
}