package cn.itcast.Map;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 正則表達式
*? 預定義字符:
*? . 任何字符(與行結束符可能匹配也可能不匹配)
*? ? ? \d 數字 [0-9]
*? ? ? \D 非數字[^0-9]
*? ? ? \s 空白字符 [\t\n\x0B\f\r]
*? ? ? \S 非空白字符 [^\s]
*? ? ? \w 組成單詞的字符[a-zA-Z_0-9]
*? ? ? \W 非單詞字符 [^\w]
*? ? ? 注意:元字符只能匹配一個字符
* 匹配多位:
* ? 匹配0次或者一次;
*? x* 匹配0次或多次
*? + 出現1次或多次
*? {n} 出現n次
*? {n,} 出現至少n次
*? {n,m} 出現n到m次
* 范圍
* [abc] a,b或c
* [^abc] 任何字符,出了abc以外
* [a-zZ-Z] a到z或者A到Z, 包含開頭和結尾
* [a-d[m-p]] a到d 或 m到p [a-dm-p】并集
* [a-z&&[def] d,e或f 交集
*? ? 注意:范圍也是只匹配一個字符,如果要匹配數量,需要使用數量多位匹配
*
* 邊界匹配器
* ^行開始
* $行結尾
* \b 單詞邊界
* 正則表達式的作用:
*
* 1. 匹配
* 如果正則表達式的內容需要被復用,那么就需要對正則表達式進行分組,目的是復用匹配內容。組號不能指定,是從1開始的。
* (rgex)用括號進行分組
* \1 表示第一組的內容
* \2 表示第二組的內容
* 如果在regex外引用分組內容,要使用$符號
*
*
* 2. 切割
* split()
*
* 2. 替換
* replaceAll(String regex, String replacement))? 全部替換
*
* 4. 查找
* 指定為字符串的正則表達式必須先被編譯為此類的實例,然后再將得到的模式用于創建Mather對象
* 依照正則表達式,該對象可以與任意字符序列匹配,執行匹配送涉及的所有狀態駐留在匹配器中,所以多個匹配器可以共享同一模式,因此
* 典型的順序是:
*? Pattern p = Pattern.compile("a*b");
*? Matcher m = p.matcher("aaaaab");
*? 查找需要的類
*? Pattern 正則類
*? Matcher 匹配器對象
*? 匹配器的方法:
*? 1. find() 通知匹配器去匹配符合條件的子串,如果能找到返回TRUE,找不到返回false
*? 2 .group() 獲取符合條件的子串
*
*? 注意: 使用group方法的時候,一定要使用find方法先去查找,類似迭代查找輸出,直到查找不到
*
*
*/
public class Demo5 {
public static void main(String[] args) {
System.out.println("%".matches("."));
System.out.println("9".matches("\\d"));
String str = "大家家家明天天天天回很開開心心心的回家家樂";
String[] arr = str.split("(.)\\1+");
System.out.println(Arrays.toString(arr));
replaceTest();
matchTest();
}
public static void replaceTest(){
String str = "我我我我我我愛愛愛你你你,真真的!";
str = str.replaceAll("(.)\\1+","$1");
System.out.println(str);
}
public static void matchTest(){
//找出3個字母組成的單詞
String content = "da jia de jia qi wang ti hjiao fjdsl fds";
String reg = "\\b[a-zA-Z]{3}\\b";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(content);
while(m.find()){
System.out.println(m.group());
}
}
}