常见应用
- 匹配字符串
需求:验证手机号码是否合法:
手机号码的规则:
号码是11位数字;
号码只能以1开头;
号码的第二位可以是:3,4,5,7,8;
从第三位开始后面的数字都可以是0到9的任意数字;
一般开发中,像这种负责验证某种字符串规则的正则表达式,一般都不会改变;例如,验证手机号、验证邮箱等正则表达式;
在开发中,像这种基本不会改变的东西,应该定义为常量;
像这种特殊用途的常量,一般都会抽取到一个固定的工具类中,方便整个程序里面使用;
- 分割字符串
需求:按重复的字符分隔字符串:”qwe##asdf####zx#######cv”;
替换字符串
- 替换重复的相同字符
需求:替换字符串中重复的#为-:
1、原字符串:”qwe##as#df####zx#######cv”;
替换后:”qwe-as#df-zx-cv”;
- 替换重复的不同字符
1、原字符串:”qwe##asdfxxxxzx%%%%%cv”;
替换后:”qwe-asdf-zx-cv”;
- 原字符串:”qwe##asdfxxxxzx%%%%%cv”;
替换后:”qwe#asdfxzxc%cv”;
- 将一个手机号中间四位替换为****表示;前三位和后四位不变;
例如:168 8888 8888 替换后为: 168 **** 8888
https://www.zhihu.com/video/1067487492223270912
- 获取字符串中匹配的子串
通过正则表达式获取字符串中匹配的子串的步骤:
1、通过正则规则和Pattern类的静态函数compile 创建Pattern类的实例对象: Pattern p = Pattern.compile(正则规则);
2、根据创建的Pattern对象和要匹配的字符串创建匹配器对象(Matcher类的实例对象);Matcher m = p.matcher(“匹配的字符串”);
3、通过匹配器对象的find方法判断是否有匹配对象: boolean b = m.find();
如果有,使用group方法获取匹配的子串: String str = m .group();
需求:获取字符串"张三:13233332323;李四:15666668888;王五:18288999988"中所有电话号码;
正则表达式总结
正则表达式,在Java中的体现就是一个字符串,可以表示一定的匹配规则,专门用于字符串的匹配的;正则表达式,是一门在很多领域都广泛使用的技术,不是Java独有的;
正则表达式的组成:
- 一般字符:表示匹配自身;如:”a”,表示匹配的字符传的值只能是”a”;所有普通字符串,都可以看作是一个正则表达式,匹配的是它自身;
- 字符类:使用中括号[]和里面的内容组成,表示一个字符的取值范围;如:[a-z]:表示被匹配的字符的值可以是所有的小写字母;
- 预定义字符类:使用特殊符号或转义字符组成的表示特殊匹配范围的规则,如:”.”
- 边界匹配器:表示匹配一些字符串的边界,如:^:表示匹配一行的开始;$:表示匹配一行的结束;
- 数量词:前面必须跟一个规则,表示这个规则可以重复的次数;如:d+:表示最少有一个数字;.?:表示最多有一个任意字符;
- 组:使用小括号将一个或多个规则括起来,就形成了组;在同一个正则表达式中,后面引用前面定义的组中的规则,格式是: 组号
- 在同一个语句中,后面的正则表达式也可以引用前面正则表达式中定义的规则,使用的格式是: $组号
正则中的组,组号是按照组的书写顺序,从前往后,从1开始,逐渐递增的;如:
- (b):定义了两个组;1组:(a);2组:(b);
(a(b(cde)(f))):定义了四个组;1组:(a(b(cde)(f)));2组:(b(cde)(f);3组:(cde);4组:(f);
调用组的地方匹配的内容和被调用组中匹配的内容一致;
- 正则表达式的常见应用,有字符串的匹配、切割、替换和获取;
匹配、切割和替换的应用,直接通过String类提供的方法就可以完成;
获取功能,需要经过三步:
- 先根据写好的正则表达式创建一个Pattern类的对象;
- 根据创建的Patter类对象和要匹配的字符串出创建一个匹配器对象;
- 通过匹配器对象来匹配和获取需要的子字符串;判断是否有匹配的子串;