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());
}
}
}