概述(Regex)
专门用来操作字符串的技术,而且可以简化代码,用于字符串的复杂操作(底层为代码,但是表现形式简洁)
弊端
符号越多,阅读性越差(所以学习正则要先学一些符号)
正则表达式的符号
符号 | 说明 |
[] | 判断字符位上的内容(里面可以使用[] -) 一个范围 |
预定义字符 | |
. | 任意字符 |
\d | 数字,[0-9] |
\D | 非数字,[^0-9] |
\s | 空白字符,[ \t\n\x0B\f\r] |
\S | 非空白字符,[^\s] |
\w | 单词字符,[a-zA-Z_0-9] |
\W | 非单词字符,[^\w] |
数量词 | |
X? | 表示X出现的次数没有或只有一次(一次或一次也没有) |
X* | 表示X出现的次数没有或有多次(有无均可) |
X+ | 表示X出现的次数有一次或多次(一次及以上) |
X{n} | 表示X恰巧出现n次 |
X{n,} | 表示X出现的次数为n次或n次以上 |
X{n,m} | 表示X出现的次数为n次以上且m次以下 |
边界字符 | |
^ | 行开头 |
$ | 行结尾 |
\b | 单词边界 |
在正则中\表示转义,所以想要使用普通的字符但是该字符在正则中有特殊含义,需要使用转义,即\\,将正则表达式中的字符转为普通的字符,如单词边界为\b,在字符串内应写为\\b(其中\\表示为普通字符\)
正则对字符串的常规操作
匹配
使用的方法为 matches方法 匹配结果为boolean
切割(在正则中"."(任意字符)当切割符,结果为空)
使用的方法为 split方法 切割结果为String[]
替换
概述
使用的方法为替换方法 替换结果为String
replaceAll方法(regex,str)替换通过regex转换后的全部字符串为str字符串
replaceFirst方法(regex,str)替换通过regex判断的第一个字符为str字符串
实例
- 将叠词替换成$
String str = "mifjfiejjjjfjiweojwaaafe";
String regex = "(.)\\1+";
str = str.replaceAll(regex,"\\$");//结果为:mifjfie$fjiweojw$fe
- 将叠词替换成相同的一个字符
String regex = "(.)\\1+";
str = str.replaceAll(regex,"$1");//结果为:mifjfiejfjiweojwafe
- 将手机号中间四位隐藏
String str = "18679076847";
String regex = "(\\d{3})\\d{4}(\\d{4})";
str = str.replaceAll(regex,"$1****$2");//结果为:186****6847
- 将帖子中的私人信息隐藏为***
String str = "我的qq是:3226301541;电话号码是:18679076847";
String regex = "\\d{4,}";
str = str.replaceAll(regex,"***");
System.out.println(str);//结果为:我的qq是:***;电话号码是:***
获取
正则表达式类与匹配器
使用场景
正则表达式为类Pattern ,使用了正则方法的底层都使用了正则对象中的功能,String中没有解决方法时,可以使用Pattern对象
Matcher 为匹配器
必须首先将正则表达式(指定为字符串)编译为此类的实例
然后将所得的图案可以被用来创建一个Matcher对象可以匹配任意character sequences针对正则表达式
执行匹配的所有状态都驻留在匹配器中,所以许多匹配者可以共享相同的模式
Pattern(正则表达式在Java中的表现形式) 使用方法
- 将正则表达式字符串编译成正则对象Pattern
- 通过Pattern对象获取Matcher对象(匹配器对象)
- 通过匹配器对象对字符串进行规则的匹配,结果都在匹配器中
- 通过匹配器对象中的功能获取结果
规范代码:
Pattern p = Pattern.compile("a*b");//把正则编译成对象
Matcher m = p.matcher("aaaaab");//通过对象获取匹配器,通过匹配器将规则和字符串进行匹配
boolean b = m.matches();
Matcher匹配器的创建(三种方式)
- matches方法尝试将整个输入序列与模式进行匹配(匹配整个)
- lookingAt方法尝试将起始于输入序列的输入序列与模式进行匹配(从头开始)
- find方法扫描输入序列,寻找匹配模式的下一个子序列(可以匹配下一个)
Matcher匹配器中常用方法介绍
方法 | 说明 |
group方法 | 返回在上一次匹配操作期间由给定组捕获的输入子序列 |
start方法 | 返回上一个匹配的起始索引 |
end方法 | 返回最后一个字符匹配后的偏移量 |
find方法 | 尝试找到匹配模式的输入序列的下一个子序列 |
实例
//将字符串中含有三个单词的字符串提取出来
String str = "da jia zhu yi le ming tian fang jia le";
//String regex = "[a-zA-Z]{3}";//结果为jia zhu min tia fan jia,所以需要加边界
String regex = "\\b[a-zA-Z]{3}\\b";//结果为jia zhu jia
//获取正则表达式对象
Pattern p = Pattern.compile(regex);
//和操作字符串相关联,获取对应的匹配器对象
Matcher m = p.matcher(str);
//find方法
while(m.find()) {
//group方法,返回上一次匹配成功的字符串
//start方法:匹配规则前角标位
//end方法:匹配方法后角标位
System.out.println(m.group());
//System.out.println(str.substring(m.start(),m.end()));//与使用group效果一样
}
正则规则的复用
- 先封装
- 用小括号完成,封装完后有编号,编号从1开始
- 规则中被()封装的称为组,直接通过编号可以调动对应的组 , 编号需要通过转义符号转义
如:\\1使用已有组的第一组的内容,原则:先有组,才可以使用对应的编号(组0始终代表整个表达式) - 在参数列表中,其他参数要使用之前参数中规则的组,需要使用$+组编号 \\n只能使用在正则表达式中