正則運算式02
5.4正則運算式語法02
5.4.6捕獲分組
詳見5.3.3
例子
package li.regexp;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//演示分組
public class RegExp07 {
public static void main(String[] args) {
String content = "hanshunping s7789 nn1189han";
//下面就是非命名分組
//說明
// matcher.group(0) 是不加括號匹配到的字串
// matcher.group(1) 是不加括號匹配到的字串的第一個分組的內容
// matcher.group(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("第一個分組的內容:" + matcher.group(1));
System.out.println("第一個分組的內容[通過組名]:" + matcher.group("g1"));
System.out.println("第二個分組的內容:" + matcher.group(2));
System.out.println("第二個分組的內容[通過組名]:" + matcher.group("g2"));
}
}
}
5.4.7非捕獲分組

例子
給定一個字串String content ="hello韓順平教育 jack韓順平老師 韓順平同學hello";
使用非捕獲分組完成,有如下要求:
- 找到韓順平教育、韓順平老師、韓順平同學 子字串
- 找到韓順平 這個關鍵字,但是要求只是查找韓順平教育和韓順平老師中包含的韓順平
- 找到韓順平這個關鍵字,但是要求只是查找不是(韓順平教育和韓順平老師)中包含有的韓順平
package li.regexp;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExp08 {
public static void main(String[] args) {
String content = "hello韓順平教育 jack韓順平老師 韓順平同學hello";
// 1. 找到 韓順平教育、韓順平老師、韓順平同學 子字串
//String regStr = "韓順平教育|韓順平老師|韓順平同學";
//上面的寫法可以等價于非捕獲分組,注意:不能matcher.group(1)
//String regStr = "韓順平(?:教育|老師|同學)";
// 2. 找到 韓順平 這個關鍵字,但是要求只是查找 韓順平教育 和 韓順平老師 中包含的韓順平
//下面也是非捕獲分組,也不能matcher.group(1)
//String regStr = "韓順平(?=教育|老師)";
// 3. 找到 韓順平 這個關鍵字,但是要求只是查找不是(韓順平教育和韓順平老師)中包含有的韓順平
//下面也是非捕獲分組,也不能matcher.group(1)
String regStr = "韓順平(?!教育|老師)";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("找到:" + matcher.group(0));
}
}
}
5.4.8非貪婪匹配
| 字符 | 說明 |
|---|---|
| ? | 當此字符緊隨任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后時,匹配模式是"非貪心的","非貪心的"模式匹配搜索到的、盡可能短的字串,而默認的"貪心的"模式匹配搜索到的、盡可能長的字串,例如,在字串"oooo"中,"o+?"只匹配單個"o",而"o+"匹配所有"o", |
例子
package li.regexp;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExp09 {
public static void main(String[] args) {
String content = "hello111111 ok";
//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));
}
}
}
5.5正則應用實體
- 對字串進行如下驗證
-
漢字
-
郵政編碼
要求:是1-9開頭的一個六位數,比如:123890
-
QQ號碼:
要求:是一個1-9開頭的一個(5位數-10位數),比如:12389,1345687,187698765
-
手機號碼
要求:必須以13,14,15,18開頭的11位數,比如:13588889999
-
URL:https://www.bilibili.com/video/BV1fh411y7R8?p=893&spm_id_from=pageDriver&vd_source=7e137c3a1559f85aacb1f151bb0a830d
例子1:
package li.regexp;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//正則運算式的應用實體
public class RegExp10 {
public static void main(String[] args) {
String content = "1358888999";
//1. 漢字
//String regStr="^[\u4e00-\u9fa5]+$";//^和 $同時出現時,表示只能匹配 ^和 $之間的內容
//2. 郵政編碼
//要求:是1-9開頭的一個六位數,比如:123890
//String regStr="^[1-9]\\d{5}$";
//3. QQ號碼:
//要求:是一個1-9開頭的一個(5位數-10位數),比如:12389,1345687,187698765
//String regStr = "^[1-9]\\d{4,9}$";
//4. 手機號碼
//要求:必須以13,14,15,18開頭的11位數,比如:13588889999
String regStr = "^1[3458]\\d{9}$";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
if (matcher.find()) {
System.out.println("滿足格式");
} else {
System.out.println("不滿足格式");
}
}
}
例子2:
package li.regexp;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExp11 {
public static void main(String[] args) {
String content = "https://www.bilibili.com/video/BV1fh411y7R8?p=894&spm_id_from=pageDriver&vd_source=7e137c3a1559f85aacb1f151bb0a830d";
String content2 = "https://10fastfingers.com/typing-test/simplified-chinese";
String content3 = "https://zh.ua1lib.org/";
/**
* 思路:
* 1.先確定URL的開始部分 https:// 或 http://
* ((https|http)://)
* 2.接著是域名部分 www.bilibili.com
* www. 和 bilibili. 可以寫成 ([\\w-]+\\.)+
* [\\w-]+ 則匹配 com
* 3.接著是域名后面
* 3.1首先是整體
* ()?表示()里面的出現零次或者一次
* 3.2然后是小括號里面
* \\/ 表示匹配 / 號
* [ ]* 表示匹配中括號里面的 0-n次
* 3.3中括號里面
* \w-?=&/:.# 表示匹配 `數字` 或 `大小寫字母` 或 `下劃線` 或 `-` 或 `?` 或 `=` 或 `&` 或 `/` 或 `:` 或 `.` 或 `#`
*/
String regStr="^((https|http)://)([\\w-]+\\.)+[\\w-]+(\\/[\\w-?=&/:.#]*)?$";//注意:中括號里面的字符都是它本省的含義,不用轉義
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content3);
if (matcher.find()) {
System.out.println("滿足格式");
} else {
System.out.println("不滿足格式");
}
}
}
注意:中括號里面的字符都是它本省的含義,不用轉義
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/519037.html
標籤:其他
上一篇:Lists.partition
下一篇:分布式Session如何存盤
