1 正則表達式的概述
//匹配目標:匹配所有四個數字
String regStr = "(\\d\\d)(\\d\\d)";
//2. 創(chuàng)建模式對象[即正則表達式對象]
Pattern pattern = Pattern.compile(regStr);
//3. 創(chuàng)建匹配器
//說明:創(chuàng)建匹配器matcher, 按照 正則表達式的規(guī)則 去匹配 content字符串
Matcher matcher = pattern.matcher(content);
//一旦匹配成功了 find()方法就會返回true
/* * matcher.find() 完成的任務 (考慮分組)
* 什么是分組坟冲,比如 這樣的規(guī)則"(\d\d)(\d\d)" ,正則表達式中有() 表示分組,第1個()表示第1組,第2個()表示第2組...
* 1. 根據指定的規(guī)則 ,定位滿足規(guī)則的子字符串(比如(19)(98))
* 2. 找到后雇毫,將 子字符串的開始的索引記錄到 matcher對象的屬性 int[] groups;
* 2.1 groups[0] = 0 , 把該子字符串的結束的索引+1的值記錄到 groups[1] = 4
* 2.2 記錄1組()匹配到的字符串 groups[2] = 0 groups[3] = 2
* 2.3 記錄2組()匹配到的字符串 groups[4] = 2 groups[5] = 4
* 2.4.如果有更多的分組.....
*/
while (matcher.find()) {
//小結
//1. 如果正則表達式有() 即分組
//2. 取出匹配的字符串規(guī)則如下
//3. group(0) 表示匹配到的子字符串
//4. group(1) 表示匹配到的子字符串的第一組字串
//5. group(2) 表示匹配到的子字符串的第2組字串
//6. ... 但是分組的數不能越界.
System.out.println("找到: " + matcher.group(0));
System.out.println("第1組()匹配到的值=" + matcher.group(1));
System.out.println("第2組()匹配到的值=" + matcher.group(2));
}
2 轉義符
對于特殊字符串 需要用轉義符來處理
public static void main(String[] args) {
String content = "abc$(a.bc(123( )";
//匹配"(" => \\(
//匹配"." => \\.
//String regStr = "\\(";
String regStr = "\\.";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("找到 " + matcher.group(0));
}
}
3 基本語法
image.png
image.png
public static void main(String[] args) {
String content = "a11c8abc _ABCy @";
//String regStr = "[a-z]";//匹配 a-z之間任意一個字符
//String regStr = "[A-Z]";//匹配 A-Z之間任意一個字符
//String regStr = "abc";//匹配 abc 字符串[默認區(qū)分大小寫]
//String regStr = "(?i)abc";//匹配 abc 字符串[不區(qū)分大小寫]
//String regStr = "[0-9]";//匹配 0-9 之間任意一個字符
//String regStr = "[^a-z]";//匹配 不在 a-z之間任意一個字符
//String regStr = "[^0-9]";//匹配 不在 0-9之間任意一個字符
//String regStr = "[abcd]";//匹配 在 abcd中任意一個字符
//String regStr = "\\D";//匹配 不在 0-9的任意一個字符
// String regStr = "\\w";//匹配 大小寫英文字母, 數字碳竟,下劃線
//String regStr = "\\W";//匹配 等價于 [^a-zA-Z0-9_]
//\\s 匹配任何空白字符(空格,制表符等)
//String regStr = "\\s";
//\\S 匹配任何非空白字符 ,和\\s剛好相反
//String regStr = "\\S";
//. 匹配出 \n 之外的所有字符,如果要匹配.本身則需要使用 \\.
String regStr = ".";
//說明
//1. 當創(chuàng)建Pattern對象時种远,指定 Pattern.CASE_INSENSITIVE, 表示匹配是不區(qū)分字母大小寫.
Pattern pattern = Pattern.compile(regStr/*, Pattern.CASE_INSENSITIVE*/);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("找到 " + matcher.group(0));
}
}
4 選擇匹配符
選擇匹配符就是或的意思
public static void main(String[] args) {
String content = "hanshunping 韓 寒冷";
String regStr = "han|韓|寒";
Pattern pattern = Pattern.compile(regStr/*, Pattern.CASE_INSENSITIVE*/);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("找到 " + matcher.group(0));
}
}
5 限定符
用于指定其前面的字符和組合項連續(xù)出現多少次
image.png
image.png
public static void main(String[] args) {
String content = "a211111aaaaaahello";
//a{3},1{4},\\d{2}
//String regStr = "a{3}";// 表示匹配 aaa
//String regStr = "1{4}";// 表示匹配 1111
//String regStr = "\\d{2}";// 表示匹配 兩位的任意數字字符
//a{3,4},1{4,5},\\d{2,5}
//細節(jié):java匹配默認貪婪匹配款筑,即盡可能匹配多的
//String regStr = "a{3,4}"; //表示匹配 aaa 或者 aaaa
String regStr = "1{4,5}"; //表示匹配 1111 或者 11111 腋么,遵守貪婪匹配咕娄,意思是 如果字符串是"11111" 那么就會匹配出"11111",而不是"1111"
//String regStr = "\\d{2,5}"; //匹配2位數或者3,4,5
//1+
//String regStr = "1+"; //匹配一個1或者多個1
//String regStr = "\\d+"; //匹配一個數字或者多個數字
//1*
//String regStr = "1*"; //匹配0個1或者多個1
//?的使用, 遵守貪婪匹配 ,意思就是如果字符串是"a1",那么就會匹配出"a1"而不是"a"
// String regStr = "a1?"; //匹配 a 或者 a1
//限定符 限定的對象是前面一個單元 党晋,如果想限定前面一個整體 那么需要將前面的整體使用"()"括起來谭胚,比如:
//m+abc* :以至少一個m開頭徐块,后接ab未玻,然后后接至少一個"c"字符串,比如 mab胡控,mmab,mabc,mmabc 都可以
//m+(abc)* :以至少一個m開頭扳剿,后接至少一個"abc"字符串,比如 m昼激,mm,mabc,mmabc 都可以
Pattern pattern = Pattern.compile(regStr/*, Pattern.CASE_INSENSITIVE*/);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("找到 " + matcher.group(0));
}
}
6 定位符
定位符, 規(guī)定要匹配的字符串出現的位置庇绽,比如在字符串的開始還是在結束的位置
image.png
public static void main(String[] args) {
String content = "hanshunping sphan nnhan";
//String content = "123-abc";
//以至少1個數字開頭,后接任意個小寫字母的字符串
//String regStr = "^[0-9]+[a-z]*";
//以至少1個數字開頭, 必須以至少一個小寫字母結束
//String regStr = "^[0-9]+\\-[a-z]+$";
//表示匹配邊界的han[這里的邊界是指:被匹配的字符串最后,
// 也可以是空格的子字符串的后面]
//String regStr = "han\\b";
//和\\b的含義剛剛相反
String regStr = "han\\B";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("找到=" + matcher.group(0));
}
}
7 分組
image.png
image.png
public static void main(String[] args) {
String content = "hanshunping s7789 nn1189han";
//下面就是非命名分組
//說明
// 1. matcher.group(0) 得到匹配到的字符串
// 2. matcher.group(1) 得到匹配到的字符串的第1個分組內容
// 3. matcher.group(2) 得到匹配到的字符串的第2個分組內容
//String regStr = "(\\d\\d)(\\d\\d)";//匹配4個數字的字符串
//命名分組: 即可以給分組取名
String regStr = "(?<g1>\\d\\d)(?<g2>\\d\\d)";//匹配4個數字的字符串
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("找到=" + matcher.group(0));
System.out.println("第1個分組內容=" + matcher.group(1));
System.out.println("第1個分組內容[通過組名]=" + matcher.group("g1"));
System.out.println("第2個分組內容=" + matcher.group(2));
System.out.println("第2個分組內容[通過組名]=" + matcher.group("g2"));
}
}
public static void main(String[] args) {
String content = "hello韓順平教育 jack韓順平老師 韓順平同學hello韓順平學生";
// 找到 韓順平教育 橙困、韓順平老師瞧掺、韓順平同學 子字符串
//String regStr = "韓順平教育|韓順平老師|韓順平同學";
//上面的寫法可以等價非捕獲分組, 注意:不能 matcher.group(1)
//String regStr = "韓順平(?:教育|老師|同學)";
//找到 韓順平 這個關鍵字,但是要求只是查找韓順平教育和 韓順平老師 中包含有的韓順平
//下面也是非捕獲分組,不能使用 matcher.group(1)
//String regStr = "韓順平(?=教育|老師)";
//找到 韓順平 這個關鍵字,但是要求只是查找 不是 (韓順平教育 和 韓順平老師) 中包含有的韓順平
//下面也是非捕獲分組凡傅,不能使用 matcher.group(1)
String regStr = "韓順平(?!教育|老師)";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("找到: " + matcher.group(0));
}
}
8 非貪婪匹配
public static void main(String[] args) {
String content = "hello111111 ok";
//String regStr = "\\d+"; //默認是貪婪匹配
// String regStr = "\\d+?"; //非貪婪匹配
String regStr = "\\d+?"; //非貪婪匹配
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("找到: " + matcher.group(0));
}
}
9 整體匹配
//整體匹配辟狈,返回一個boolean值,表示content整體是否匹配regStr的格式
Pattern.matches(regStr, content)
public static void main(String[] args) {
String content = "hello abc hello, ";
//String regStr = "hello";
String regStr = "hello.*";
boolean matches = Pattern.matches(regStr, content);
System.out.println("整體匹配= " + matches);
}
10 String類使用正則表達式
String類也可以使用正則表達式來方便的實現功能
public static void main(String[] args) {
String content = "2000年5月,JDK1.3哼转、JDK1.4和J2SE1.3相繼發(fā)布明未,幾周后其" +
"獲得了Apple公司Mac OS X的工業(yè)標準的支持。2001年9月24日壹蔓,J2EE1.3發(fā)" +
"布趟妥。" +
"2002年2月26日,J2SE1.4發(fā)布佣蓉。自此Java的計算能力有了大幅提升";
//使用正則表達式方式披摄,將 JDK1.3 和 JDK1.4 替換成JDK
content = content.replaceAll("JDK1\\.3|JDK1\\.4", "JDK");
System.out.println(content);
//要求 驗證一個 手機號, 要求必須是以138 139 開頭的
content = "13888889999";
if (content.matches("1(38|39)\\d{8}")) {//String的 ()是整體匹配
System.out.println("驗證成功");
} else {
System.out.println("驗證失敗");
}
//要求按照 # 或者 - 或者 ~ 或者 數字 來分割
System.out.println("===================");
content = "hello#abc-jack12smith~北京";
String[] split = content.split("#|-|~|\\d+");
for (String s : split) {
System.out.println(s);
}
}
11 自己的例子
- 1 匹配時間格式:"HH:mm:ss"
public static void main(String[] args) {
// 匹配時間格式:"HH:mm:ss"
String content = "11:01:11";
//嚴格按照HH:mm:ss格式匹配勇凭,
// String regStr = "^(0[0-9]|1[0-9]|2[0-3]):[0-5]\\d:[0-5]\\d$";
//不嚴格按照HH:mm:ss格式匹配行疏,遇到個位數 可省略0,如"1:1:1"
String regStr = "^([0-1]?[0-9]|[2][0-3]):([0-5]?[0-9]):([0-5]?[0-9])$";
boolean matches = Pattern.matches(regStr, content);
System.out.println("整體匹配= " + matches);
}