簡單方便的正則表達式—秒懂
正則表達式概述
是指一個用來描述或者匹配一系列符合某個語法規則的字符串的單個字符串。其實就是一種規則。有自己特殊的應用。
作用:專門用於操作字符串
特點:用一些特定的符號來表示一些代碼的操作.這樣就簡化書寫.
所以學正則表達式,就是學習一些特殊符號的使用.
好處:可以簡化對字符串的操作
弊端:符號定義越多,正則越長,閱讀性越差
字符類
java.util.regex包中的Pattern類中
[abc] a、b 或 c(簡單類)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a到 z 或 A到 Z,兩頭的字母包括在內(范圍)
[0-9] 0到9的字符都包括
-
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](並集)
-
[a-z&&[def]] d、e 或 f(交集)
-
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](減去)
-
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](減去)
-
-
System.out.println("10".matches(regex)); //10代表1字符和0字符,不是單個字符//false
-
String regex = "[abc]"; //[]代表單個字符
預定義字符類
. 任何字符(一個,兩個點代表任意兩個字符)。
\d 數字:[0-9]
\w 單詞字符:[a-zA-Z_0-9]
案例:
-
\D 非數字: [^0-9]
-
\s 空白字符:[ \t\n\x0B\f\r] //空格,\t:制表符,\n:換行,\x0B:垂直制表符,\f:翻頁,\r:回車
-
\S 非空白字符:[^\s]
-
\w 單詞字符:[a-zA-Z_0-9]
-
\W 非單詞字符:[^\w]
-
System.out.println("\\");//要打印出\,並需再加一個\進行轉義
-
String regex = "\\d"; //\代表轉義字符,如果想表示\d的話,需要\\d
-
String regex = "..";(一個點一個字符,兩個點兩個字符)
數量詞
* A:Greedy 數量詞
* X? X(任意字符),一次或一次也沒有
* X* X,零次或多次
* X+ X,一次或多次
* X{n} X,恰好 n 次
* X{n,} X,至少 n 次
* X{n,m} X,至少 n 次,但是不超過 m 次
案例:
-
String regex = "[abc]{5,15}";
-
String regex = "[abc]{5,}";//>=5次
-
String regex = "[abc]{5}";//恰好n次
-
String regex = "[abc]+";(一次或多次)
-
String regex = "[abc]*";(0次到多次)
-
String regex = "[abc]?";(abc出現一次或一次也沒有)
把給定字符串中的數字排序
需求:我有如下一個字符串:"91 27 46 38 50",請寫代碼實現最終輸出結果是:"27 38 46 50 91"
案例:
-
import java.util.Arrays;
-
public class Test1 {
-
/**
-
* 分析:
-
* 1,將字符串切割成字符串數組(字符串排序,比較第一個不相同的字符)
-
* 2,將字符串轉換成數字並將其存儲在一個等長度的int數組中
-
* 3,排序
-
* 4,將排序后的結果遍歷並拼接成一個字符串
-
*/
-
public static void main(String[] args) {
-
String s = "91 27 46 38 50";
-
//1,將字符串切割成字符串數組
-
String[] sArr = s.split(" ");
-
//2,將字符串轉換成數字並將其存儲在一個等長度的int數組中
-
int[] arr = new int[sArr.length];
-
for (int i = 0; i < arr.length; i++) {
-
arr[i] = Integer.parseInt(sArr[i]); //將數字字符串轉換成數字
-
}
-
-
//3,排序
-
Arrays.sort(arr);
-
-
//4,將排序后的結果遍歷並拼接成一個字符串27 38 46 50 91
-
/*String str = "";//會產生很多垃圾,不斷的+,原來的就變成了垃圾
-
for (int i = 0; i < arr.length; i++) {
-
if(i == arr.length - 1) {
-
str = str + arr[i]; //27 38 46 50 91
-
}else {
-
str = str + arr[i] + " "; //27 38 46 50
-
}
-
}
-
-
System.out.println(str);*/
-
-
StringBuilder sb = new StringBuilder();
-
for (int i = 0; i < arr.length; i++) {
-
if(i == arr.length - 1) {
-
sb.append(arr[i]);
-
}else {
-
sb.append(arr[i] + " ");
-
}
-
}
-
-
System.out.println(sb);
-
}
-
-
}
正則表達式的替換功能
String類的功能:public String replaceAll(String regex,String replacement)
案例:
-
public class Demo6_ReplaceAll {
-
public static void main(String[] args) {
-
String s = "wo111ai222kailing";
-
String regex = "\\d"; //\\d代表的是任意數字
-
String s2 = s.replaceAll(regex, "");//把任意數字替換成空串
-
}
-
}
正則表達式的分組功能
正則表達式的分組功能
捕獲組可以通過從左到右計算其開括號來編號。例如,在表達式 ((A)(B(C))) 中,存在四個這樣的組:
1 ((A)(B(C)))
2 (A
3 (B(C))
4 (C)
案例演示
a:切割
需求:請按照疊詞切割: "sdqqfgkkkhjppppkl";
b:替換
需求:我我....我...我.愛...愛愛...愛.編..編編.編.程.程.程..程
將字符串還原成:"我愛編程"。
說明
(.)\\1+的含義: (.)把任意字符存在組里,第一個位置為任意字符,第二個位置和(.)一樣,但是第二個位置出現了1次或多次
(.)通過"\"形式反向引用前面的組,\\1表示第一組的內容在\\1重新出現,可以1次或多次
替換:
-
private static void demo3() {
-
String s = "我我....我...我.愛...愛愛...愛.編..編編.編.程.程.程..程";
-
String s2 = s.replaceAll("\\.+", "");
-
String s3 = s2.replaceAll("(.)\\1+", "$1");
-
說明:
-
1第三行作用為把字符串中所有點".",替換為空字符串""
-
點(.)在正則表達式中代表任意字符,它具有特殊的含義, 所以需要將點進行轉義前面加\,但是要想表示出一個\,需要在前面再加一個\,這樣就成了\\.
-
2第四行: 將連續重復的字符用自己本生替代
-
$1代表第一組中的內容,(.)把任意字符存在組里,
-
3第一個括號是第一組, 第二個括號,第二組,用$2
-
}
按照疊詞切割字符串
-
public static void demo2() {
-
//需求:請按照疊詞切割: "sdqqfgkkkhjppppkl";
-
String s = "sdqqfgkkkhjppppkl";
-
//String regex = "(.)\\1";
-
String regex = "(.)\\1+"; //+代表第一組出現一次到多次
-
String[] arr = s.split(regex);
-
-
for (int i = 0; i < arr.length; i++) {
-
System.out.println(arr[i]);
-
}
-
}
-
-
public static void demo1() {
-
//疊詞 快快樂樂,高高興興
-
/*String regex = "(.)\\1(.)\\2"; //\\1代表第一組又出現一次 \\2代表第二組又出現一次
-
System.out.println("快快樂樂".matches(regex));
-
System.out.println("快樂樂樂".matches(regex));
-
System.out.println("高高興興".matches(regex));
-
System.out.println("死啦死啦".matches(regex));*/
-
-
//疊詞 死啦死啦,高興高興
-
String regex2 = "(..)\\1";//第一組有兩個字符,然后讓第一組再出現一次
-
System.out.println("死啦死啦".matches(regex2));
-
System.out.println("高興高興".matches(regex2));
-
System.out.println("快快樂樂".matches(regex2));
-
}
-
-
}
Pattern和Matcher的概述
Pattern是regax包下的一個類,被final修飾
模式和匹配器的典型調用順序
通過JDK提供的API,查看Pattern類的說明
典型的調用順序是 (詳看下面案例)
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
案例:
-
public static void demo1() {
-
//"a*b":表示a出現的是0次或多次,后面跟一個b
-
Pattern p = Pattern.compile("a*b"); //獲取到正則表達式
-
(a*b代表a出現0次或多次,后面跟b)
-
Matcher m = p.matcher("aaaaab"); //獲取匹配器(里面傳一個要被匹配的字符串)
-
boolean b = m.matches(); //看是否能匹配,匹配就返回true,(matches匹配器matcher里的方法)
-
}
取出字符串中的手機號
Pattern和Matcher的結合使用
需求:把一個字符串中的手機號碼獲取出來
步驟分4步(具體看案例):
- 拿到正則表達式Pattern.compile(regex)
- 拿到匹配器p.matcher(s)
- 拿出符合規定的字符串m.find()—一般通過while來
- 返回匹配到的子序列m.group()
案例:
-
//匹配查找手機號
-
private static void demo2() {
-
String s = "我的手機是18511866260,我曾用過18987654321,還用過18812345678";
-
String regex = "1[3578]\\d{9}"; 正則表達式
-
//第一位是1,第二位是[3578]中的任意一個,后面的是任意數字\\d,並出現9次{9} 手機號碼正則表達式
-
Pattern p = Pattern.compile(regex); //拿到正則表達式
-
Matcher m = p.matcher(s); //拿到匹配器
-
while(m.find());//拿正則到字符串中找符合規定的字符串,找到返回true,找不到但會false
-
System.out.println(m.group());//返回由以前匹配操作所匹配的輸入子序列
-
}