1 概述
n正则表达式定义了字符串的模式。
n正则表达式可以用来搜索、编辑或处理文本。
正则表达式定义了字符串模式,可以用来搜索,编辑,处理文本,还可以做数据提取操作
* 不仅限于某一种语言,但是在每种语言中有细微的差别
* java中 1.4推出,在java.util.regex包下
* 在java中使用转义符,把有意义的字符转换为无意义的字符
* 但是在正则表达式中,也是转义符,所以如果我们在java中写正则表达式时,要写两个,即\
*
2 常用语法
常用语法:
* 转义符
* . 匹配任意字符
* 取值范围:
* [abc]: 可能是a,也可能是b,还可能是c
* [^abc]: 不是a,b,c中的任意一个
* [a-zA-Z]: 匹配大小写字母
* [^a-zA-Z]: 非大小写字母
* [0-9]: 数字
* [a-zA-Z0-9]: 大小写字母和数字
* 简洁表示:
* .: 任意字符
* d: 表示数字[0-9]
* D: 表示非数字[^0-9]
* s: 表示由空字符组成
* S: 表示由非空字符组成
* w: 表示字母,数字,下划线[a-zA-Z0-9]
* W: 表示非字母,数字,下划线[^a-zA-Z0-9]
* 数量相关:
* ?: 表示出现0或1次
* +: 表示出现1次或者多次 count>=1
* *: 表示出现0次或0次以上 count>=0
* {n}: 表示出现n次
* {n,}: 表示出现n次及n次以上 count>=n
* {n,m}: 表示出现n到m次 n<=count<=m
3 (),[],{}的区别
* (): 表示一个整体
* ([a-z]|[0-9]){2}
* (0-9): 注意:表示整体,而不是范围,所以这个匹配的是字符串0-9,而不是数字0到9
* []: 可以理解为字符组,字符组中-为连接符,表示区间范围
* [0-9]: 表示1,2,3,4,5,6,7,8,9都可以(即是0到9)
* {}: 表示范围
* ^: 表示开头,但在[]中表示取反
* $: 表示结尾
4 练习
4.1 匹配整数和小数
d 数字
. 任意字符
/ 转义
+ 1次或多次
? 0次或1次
() 把.和d+看做整体
d+(.d+)?
4.2 电话
d{11}
^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])d{8}$
4.3 匹配正整数
[1-9][0-9]*
4.4 非负数
\d+
4.5 整数
(-?[1-9]\d*)|0
5 java中的正则表达式
在java中,正则表达式封装为三个相关的类
* PatternSyntaxException: 异常类
* Pattern: 正则表达式对象,能做一些简单操作
* Matcher: 支持强大的正则表达式
6 Pattern
6.1 概述
l用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建
l可以通过Pattern.complie(String regex)创建一个正则表达式
l只能做一些简单的匹配操作
6.2 使用
Pattern: 很多时候我们直接使用String中的三个方法即可
* 验证: 校验操作,boolean matches(String regex)
* 拆分: String[] split(String regex)
* 替换: String replaceAll(String regex,String replace)
// 校验
public static void test2() {
String regex = "(-?[1-9]\d*)|0";
String str = "-123";
// 全词匹配,静态方法
boolean flag = Pattern.matches(regex, str);
System.out.println(flag);
// String中的方法
System.out.println(str.matches(regex));
}
// 拆分
public static void test1() {
String str = "1,2,3,4,5";
// 创建正则表达式对
Pattern pattern = Pattern.compile(",");
// 拆分方法
String[] strs = pattern.split(str);
for (String string : strs) {
System.out.println(string);
}
System.out.println("=========");
strs = str.split(",");
for (String string : strs) {
System.out.println(string);
}
7 Matcher
7.1 概述
- 构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例 Matcher m = p.matcher("aaaaab");
- 支持便捷强大的正则匹配操作,包括分组、多次匹配支持
7.2 三大方法
Matcher.matches():对整个字符串进行匹配,只有整个字符串都匹配了才返回true
Matcher.lookingAt():对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true
Matcher.find():对字符串进行匹配,匹配到的字符串可以在任何位置
7.3 字符串匹配模式
// 整数规则
String regex = "(-?[1-9]\d*)|0";
// 需要校验的字符串
String input = "12.12";
// 引擎对象
Pattern pattern = Pattern.compile(regex);
// 匹配器对象
Matcher matcher = pattern.matcher(input);
// false
System.out.println(matcher.matches());
// 不要连着使用,每次使用 都重新打开一个 matcher对象即可
// find可以调用多次,因为find适合做一些提取操作
matcher = pattern.matcher(input);
System.out.println(matcher.find());
System.out.println(matcher.find());
System.out.println(matcher.find());
matcher = pattern.matcher(input);
System.out.println(matcher.lookingAt());
7.4 整数提取
// 整数规则
// [u4e00-u9fa5] 汉字范围
// 一个小括号 就是一组
String regex = "([u4e00-u9fa5]{2,3})电话号码是(\d{11})";
// 需要校验的字符串
String input = "asd小明电话号码是13113113111sass张小黑电话号码是15115115111";
// 引擎对象
Pattern pattern = Pattern.compile(regex);
// 匹配器对象
Matcher matcher = pattern.matcher(input);
// 想要获取下一个匹配的数据,只需要再次调用find即可
// 如果find为false,说明后面没有符合条件的数据了
while (matcher.find()) {
// 0或者无参 都是获取匹配到的整个数据
// 1 就是第一组 , 2 就是第二组
System.out.println(matcher.group(0));
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
}
7.5 叠词去重
案例
我我...我我...我要..要要...要要...学学学..学学...编编编编....编程..程....程程程程..程.
* 转换为我要学编程
* 1 只留下汉字,其余字符去掉
* 2 把重复数据分为两组 , 比如 1111,分为 1 和 111
* 3 使用 1 把 1111 替换
String string = "我我......我要..要要...要要...学学学..学学...编编编编....编程..程....程程程程..程.";
string = string.replaceAll("[^u4e00-u9fa5]", "");
System.out.println(string);
String regex = "(.)(\1+)";
string = string.replaceAll(regex, "$1");
System.out.println(string);



