参考文档:https://blog.csdn.net/j2974500224/article/details/140896185
一、正则表达式规则
1、字符内容匹配
[] : 表示匹配括号里的任意一个字符。
[abc]: 匹配a,b,c 的任意一个字母;
[a-z]: 匹配小写字母的任意一个字母;
[^abc]: 匹配 a, b, c 以外的任意一个字符;
[A-Za-z]: 匹配所有的小写字母和大写字母的任意一个;
[a-zA-Z0-9]: 匹配所有的小写字母和大写字母和数字的任意一个;
[a-z&&[^bc]]: 匹配除了b和c以外的所有的小写字母;
2、字符类型匹配
\d: 匹配数字字符中的任意一个,相当于[0-9]
\w: 匹配单词字符(数字字母下划线)中的任意一个,相当于[a-zA-Z0-9_]
\s: 匹配空格、制表符、退格符、换行符等中的任意一个
\D: 匹配非数字字符中的任意一个,相当于[^0-9]
\W: 匹配非单词字符中的任意一个,相当于[^a-zA-Z0-9_]
\S: 匹配非空格、制表符、退格符、换行符等中的任意一个
. : 匹配除换行符(\n、\r)之外的任何单个字符,相当于[^\n\r]
3、字符数量匹配
X ? : 匹配0个或1个
X * : 匹配任意多个(含0)
X + : 匹配1个及以上
X {n} : 匹配n个
X {m,}: 匹配m个及以上
X {m,n}: 匹配m~n个
4、字符分组匹配
如:(153|156)[\d]{8} 匹配开头是153、156的号码
5、^和$
^:匹配字符串是否以指定表达式开头
如: ^[0-9]+ --> 123abc456edf789 以123开头,满足
$: 匹配字符串是否以指定表达式结尾
如: [0-9]+$ --> 123abc456edf789 以789结尾,满足
二、正则表达式应用
1、String类自带了若干应用正则表达式的函数,如matches()、split()、replaceAll()等
/**************************************
* 0、字符串底层存储编码
**************************************/
byte[] bytes = {-28, -72, -83, -27, -101, -67};
String str1 = new String(bytes);
System.out.println("str1 = " + str1); // "中国"
String str2 = new String(bytes,"UTF-8");
System.out.println("str2 = " + str2); // "中国"
/**************************************
* 1、正则表达式匹配字符串
**************************************/
System.out.println("a".matches("[abcdefg]")); // true
System.out.println("h".matches("[^abcdefg]")); // true
System.out.println("+".matches(".")); // 匹配+是不是一个字符 true
System.out.println("-".matches("\\.")); // \\.通配符.变成了普通的点符号 false
System.out.println("c".matches("\\w")); //不添加[]也可以 true
System.out.println("c".matches("[\\w]")); //添加[] true
// 匹配账号:账号必须是由字母数字、下划线组成的5~8位
System.out.println("_abc123".matches("\\w{5,8}")); //true
System.out.println("_abc123+".matches("\\w{5,8}")); //false
System.out.println("".matches("[a-z]?")); //true
System.out.println("n".matches("[a-z]?")); //true
System.out.println("1".matches("[a-z]?")); //false
// 匹配密码:密码必须是8位的数字或字母组合
System.out.println("abc12345".matches("[a-zA-Z0-9]{8}")); //true
System.out.println("abc1234".matches("[a-zA-Z0-9]{8}")); //false
System.out.println("abc123456".matches("[a-zA-Z0-9]{8}"));//false
// 匹配手机:137等开头的11位数字
String regex = "(13|18|15)(7|8|9)[\\d]{8}";
System.out.println("13811110000".matches(regex)); //true
System.out.println("13311110000".matches(regex)); //false
/**************************************
* 2、正则表达式分隔字符串
**************************************/
/// 请使用数字将其切分成字符串数组。
String text = "hello11world22smy333";
String[] arr = text.split("\\d+");
System.out.println(Arrays.toString(arr));
text = "888hello99world10smy";
arr = text.split("\\d+");
System.out.println(Arrays.toString(arr));
text = "123hello234world235smy";
arr = text.split("3");
System.out.println(Arrays.toString(arr));
/**************************************
* 3、正则表达式替换字符串
**************************************/
String url = "http://www.baidu.com.cn.456";
//将所有的字母替换成#
url = url.replaceAll("[a-zA-Z]+","#");
System.out.println("url: " + url);
2、Strirng正则的底层是利用Pattern类和Matcher类进行字符串的匹配。因此,我们自己编码也可以直接使用这两个类进行字符串的匹配。
/**
* 匹配字符串的开头是否符合正则表达式
*/
String text = "a123abc";
String regex = "\\d+";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
boolean result = matcher.lookingAt();
System.out.println("匹配结果: " + result);
/**
* 匹配字符串是否符合正则表达式
*/
String text = "smingyu12_";
String regex = "[a-zA-Z][_$a-zA-Z0-9]{7,9}";
Pattern pattern = Pattern.compile (regex);
Matcher matcher = pattern.matcher(text);
boolean result = matcher.matches();
System.out.println("匹配结果:" + result);
/**
* 匹配&提取字符串里符合正则表达式的子串
*/
String text = "abc123eee444ff555ggg";
String regex = "\\d+";
List<String> target = new ArrayList<>();
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
int count = 0;
while (matcher.find()) {
// target.add(source.substring(matcher.start(), matcher.end()));
target.add(matcher.group());
count++;
}
System.out.println("匹配的子串数量:" + count);
System.out.println(target);