目录
一.概念
二.正则的写法
字符
字符类
预定义字符类
边界匹配器
Greedy 数量词
运算符
三.正则的应用
1.匹配字符串
2.分割字符串
3.替换字符串
正则表达式的组
4.获取字符串
四.正则表达式的总结
1.正则表达式的组成:
2.正则表达式的常见应用,有字符串的匹配、切割、替换和获取;
正则表达式是对字符串操作的一种逻辑公式。就是用事先定义好的一些特定字符、及这些特定字符的组合,
组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
对于初学者,可以简单的理解为一类特殊的字符串
x 字符 x。举例:'a'表示字符a
\\ 反斜线字符。
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)
[0-9] 0到9的字符都包括
/**
*@function 单个字符的验证
*/
void regex() {
String regex = "[abc]";//表示只能匹配一个在它里面的字符
boolean b1 = "d".matches(regex);
System.out.println(b1);
String regex2 = "[^123]";//表示只能匹配一个不在它里面的字符
boolean b2 = "5".matches(regex2);
System.out.println(b2);
String regex3 = "[1-9A-Z]";//表示匹配一个在所示范围内的字符
boolean b3 = "M".matches(regex3);
System.out.println(b3);
String regex4 = "[M-T&&[A-Z]]";//表示匹配一个在所示两个范围的交集内的字符
boolean b4 = "B".matches(regex4);
System.out.println(b4);
}
. 任何字符。我的就是.字符本身,怎么表示呢? \.
\d 数字:[0-9]
\D 非数字:[^\d]/[^0-9]
\w 单词字符:[a-zA-Z_0-9]
\W 非字符[^\w]
/**
*@function 预定义字符的验证
*/
void regex() {
String regex = ".";//表示匹配一个任意字符
boolean b = " ".matches(regex);
System.out.println(b);
String regex1 = "\\d";//表示匹配一个数字字符
boolean b1 = "0".matches(regex1);
System.out.println(b1);
String regex2 = "\\D";//表示匹配一个非数字字符
boolean b2 = " ".matches(regex2);
System.out.println(b2);
}
^ 行的开头
$ 行的结尾
\b 单词边界, 就是不是单词字符的地方。
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
XY X后跟 Y
X|Y X 或 Y
(X) X,作为捕获组
/**
*@function 验证手机号是否合法
*1、号码是11位数字;
*2、号码只能以1开头[1]
*3、号码的第二位可以是:3,4,5,7,8 [34578]
*4、从第三位开始后面的数字都可以是0到9的任意数字\\d{9}
*/
void regex() {
//1.定义字符串
String str = "18545624879";
//2.定义正则式
String regex="1[34578]\\d{9}";
//3.判断是否合法,若合法打印"合法",否则"不合法"
if(str.matches(regex)) System.out.println("合法");
else System.out.println("不合法");
}
/**
*@function 通过 ',' 分割字符串
*/
void regex() {
//1.定义字符串
String str = "露娜:18545624879,凯:154789541236,诸葛亮:15236548745";
//2.分割并打印
String[] str1=str.split(",");
for (String string : str1) {
System.out.println(string);
}
}
/**
*@function 替换手机号的中间4位
*/
void regex() {
//1.定义字符串
String str = "露娜:18545624879,凯:154789541236,诸葛亮:15236548745";
//2.定义手机号的正则式
String regex="([\\d]{3})([\\d]{4})([\\d]{4})";
//3.替换手机号中间4位并打印
String str1=str.replaceAll(regex, "$1****$3");
System.out.println(str1);
}
如果多次使用相同的匹配规则,就可以将这个规则定义为一个组,再在后面通过组号调用,\\1;
正则中的组,就是使用英文的小括号括起来的一段规则;一个括号就是一个组;
((a)(b(c))):
1:((a)(b(c)))
2:(a)
3:(b(c))
4:(c)
通过正则表达式获取字符串中匹配的子串的步骤:
1、通过正则规则和compile 函数创建Patter类的实例对象;
2、根据创建的Patter对象和要匹配的字符串创建匹配器对象(Matcher类的实例对象);
3、通过匹配器对象的find方法判断是否有匹配对象;如果有,使用group方法获取匹配的子串;
/**
*@function 通过正则获取字符串
*/
void regex() {
String str = "露娜:18545624879,凯:154789541236,诸葛亮:15236548745";
String regex="([\\d]{3})([\\d]{4})([\\d]{4})";
//1.通过正则式和compile 函数创建Patter类的实例对象
Pattern p=Pattern.compile(regex);
//2.根据创建的Patter对象和要匹配的字符串创建匹配器对象(Matcher类的实例对象)
Matcher m=p.matcher(str);
//3.通过匹配器对象的find方法判断是否有匹配对象;如果有,使用group方法获取匹配的子串
while(m.find()) {
System.out.println(m.group());}
}
一般字符:表示匹配自身;如:”a”,表示匹配的字符传的值只能是”a”;所有普通字符串,都可以看作是一个正则表达式,匹配的是它自身;
字符类:使用中括号[]和里面的内容组成,表示一个字符的取值范围;如:[a-z]:表示被匹配的字符的值可以是所有的小写字母;
预定义字符类:使用特殊符号或转义字符组成的表示特殊匹配范围的规则,如:”.” 表示匹配所有字符;\d表示匹配0-9的所有数字;
边界匹配器:表示匹配一些字符串的边界,如:^:表示匹配一行的开始;$:表示匹配一行的结束;
数量词:前面必须跟一个规则,表示这个规则可以重复的次数;如:\d+:表示最少有一个数字;.?:表示最多有一个任意字符;
组:使用小括号将一个或多个规则括起来,就形成了组;在同一个正则表达式中,后面引用前面定义的组中的规则,格式是: \\组号
在同一个语句中,后面的正则表达式也可以引用前面正则表达式中定义的规则,使用的格式是: $组号
正则中的组,组号是按照组的书写顺序,从前往后,从1开始,逐渐递增的;如:
(a)(b):定义了两个组;1组:(a);2组:(b);
(a(b(cde)(f))):定义了四个组;1组:(a(b(cde)(f)));2组:(b(cde)(f);3组:(cde);4组:(f);
调用组的地方匹配的内容和被调用组中匹配的内容一致;
匹配、切割和替换的应用,直接通过String类提供的方法就可以完成;
获取功能,需要经过三步:
1、先根据写好的正则表达式创建一个Pattern类的对象;
2、根据创建的Patter类对象和要匹配的字符串出创建一个匹配器对象;
3、通过匹配器对象来匹配和获取需要的子字符串;判断是否有匹配的子串;