package com.javaxxz.test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 正则表达式
*
* 1、预定义字符类
* . 任何字符
* \d 数字:[0-9]
* \D 非数字:[^0-9]
* \s 空白字符:[\t\n\x0B\f\r]
* \S 非空白字符:[^\s]
* \w 单词字符:[a-zA-Z_0-9]
* \W 非单词字符:[^\w]
* 注意:任何预定义字符没有加上数量词之前都只能匹配一个字符而已
*
* 2、数量词
* X? X,零次或一次
* X* X,零次或多次
* X+ X,一次或多次
* X{n} X,恰好n次
* X{n,} X,至少n次
* X{n,m} X,至少n次,但不超过m次
*
* 3、范围词
* [abc] a、b或c
* [^abc] 任何字符,除了a、b或c(否定)
* [a-zA-Z] a到z 或 A到Z
* 注意:范围词里面不管内容有多长,没有数量词的配合都只能匹配一个字符而已
*
* 4、边界匹配器
* \b 单词边界匹配器只是代表了单词的开始或者是结束部分,不匹配任何的字符
*
* 5、正则表达式主要用于操作字符串,正则表达式对字符串的操作主要有一下几种应用
* 匹配 matches()
* // 匹配固定电话 区号-主机号 区号:首位是0 长度3-4位 主机号:首位不能是0 长度7-8位
* "021-5327015".matches("0\\d{2,3}-[1-9]\\d{6,7}")
* 切割 split
* // 根据重叠词进行切割 [大,明,玩,开心]
* "大家家家明天天玩得得得得得开心".split("(.)\\1+")
* 注意:如果正则的内容需要被复用,那么需要对正则的内容进行分组,分组的目的就是为了提高正则的复用性。
* 组号不能指定,组号是从1开始的
* 如:((A)(B(C)))
* 第1组:((A)(B(C)))
* 第2组:(A)
* 第3组:(B(C)
* 第4组:(C)
* \1:引用第1组所匹配的内容
* 替换 replaceAll(String regex, String replacement)
* "你好123先生456".replaceAll("\\d+","**")
* 结果: 你好**先生**
*
* String str = "我我我要要要做做项项项目目目"; //输出:我要做项目
* str.replaceAll("(.)\\1+","$1")
* 如果要在replaceAll方法正则的外部引用组的内容,那么是使用"$组号"
* 查找 查找需要使用的对象:
* 1、Pattern(正则对象)
* 2、Matcher(匹配器对象)
* 如:Pattern p = Pattern.compile("a*b");
* Matcher m = p.matcher("aaab");
* boolean b = m.matches();
* 匹配器要使用的方法:
* 1、find() 通知匹配器去匹配字符串,查找符合规则的字符串
* 2、group() 获取符合规则的子串
* 注意:使用group方法的时候一定要先调用find方法,
* 让匹配器去查找符合规则的字符串,否则报错。
*/
public class Demo7 {
public static void main(String[] args) {
// 找出3个字母组成的单词
String str = "da jia de jia qi wan bi liao hai kai xin ma";
String reg = "\\b[a-zA-Z]{3}\\b";
// 根据正则编译成Pattern对象
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(str);
while (m.find()) {
System.out.print(m.group() + ",");
}
// 输出结果 jia,jia,wan,hai,kai,xin,
}
}