day51-正則表達式02

正則表達式025.4正則表達式語法025.4.6捕獲分組詳見5.3.3

day51-正則表達式02

文章插圖
例子
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"));}}}
day51-正則表達式02

文章插圖
5.4.7非捕獲分組
day51-正則表達式02

文章插圖
例子
給定一個字符串String content ="hello韓順平教育 jack韓順平老師 韓順平同學hello";
使用非捕獲分組完成,有如下要求:
  1. 找到韓順平教育、韓順平老師、韓順平同學 子字符串
  2. 找到韓順平 這個關鍵字 , 但是要求只是查找韓順平教育和韓順平老師中包含的韓順平
  3. 找到韓順平這個關鍵字,但是要求只是查找不是(韓順平教育和韓順平老師)中包含有的韓順平
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));}}}
day51-正則表達式02

文章插圖
5.5正則應用實例
  • 對字符串進行如下驗證
  1. 漢字
  2. 【day51-正則表達式02】郵政編碼
    要求:是1-9開頭的一個六位數 , 比如:123890
  3. QQ號碼:
    要求:是一個1-9開頭的一個(5位數-10位數) , 比如:12389,1345687,187698765
  4. 手機號碼
    要求:必須以13,14,15,18開頭的11位數,比如:13588889999
  5. 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位數,比如:13588889999String 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("不滿足格式");}}}

推薦閱讀