对于web来说,字符串的处理特别重要,而正则表达式是对字符串处理的利器,在字符过滤,验证方面都能看到她的身影。
今天需要处理一段json字符串,在用String.replaceAll的过程中,遇到了正则表达式不会写的尴尬场景。所以还是简单地补补正则表达式的知识吧。
先从一个正则表达式的使用讲起。
[Java] 纯文本查看 复制代码
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
//这个正则表达式表示匹配1254-8888888,125-6966356这样子的字符
String regex = "\\d{3,4}-\\d{7}";
//初始字符串
String str = "agdf/1254-8888888sssdf125-6966356";
String aft = str.replaceAll(regex, "替换");
System.out.println("repalceAll后==="+aft);
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
//m.find()为true则一直匹配下去
while(m.find()){
//因为正则表达式中没有()括号,所以捕获组数为0
System.out.println("捕获组数,m.groupCount==="+m.groupCount());
//m.group()相当于m.group(0),对应着groupCount,即直接匹配,不分组
System.out.println("m.group==="+m.group(0));
}
}
}
运行结果
[Java] 纯文本查看 复制代码 repalceAll后===agdf/替换sssdf替换
m.group===1254-8888888
捕获组数,m.groupCount===0
m.group===125-6966356
捕获组数,m.groupCount===0
从那个正则表达式说起, String regex = "\\d{3,4}-\\d{7}";
"\\d"这个是java的转义,本来的正则应该是“\d”,表示的是匹配0到9的数字,应该也可以写成这样[0-9],没试过。
"\\d{3,4}"表示\d的个数有3到4个,即匹配123,3212,000这些数字,后面的“\\d{7}”同理,匹配8888888等字符。
至于分组这些,看下下面这个demo
[Java] 纯文本查看 复制代码
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
//这个正则表达式表示匹配1254-8888888,125-6966356这样子的字符
String regex = "([a-zA-Z]+)(\\d{7})";
//初始字符串
String str = "AGdf12548888888sssdf1256966356";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
//m.find()为true则一直匹配下去
while(m.find()){
//因为正则表达式中没有()括号,所以捕获组数为0
System.out.println("捕获组数,m.groupCount==="+m.groupCount());
//m.group()相当于m.group(0),对应着groupCount,即直接匹配,不分组
System.out.println("m.group(0)==="+m.group(0));
//对应第一个括号([a-zA-Z]+)
System.out.println("m.group(1)==="+m.group(1));
//对应第二个括号(\\d{7})
System.out.println("m.group(2)==="+m.group(2));
System.out.println("=============我是换行符============");
}
}
}
运行结果
[Java] 纯文本查看 复制代码 捕获组数,m.groupCount===2
m.group(0)===AGdf1254888
m.group(1)===AGdf
m.group(2)===1254888
=============我是换行符============
捕获组数,m.groupCount===2
m.group(0)===sssdf1256966
m.group(1)===sssdf
m.group(2)===1256966
=============我是换行符============
最后再附带下常用的正则表达式字符
字符的取值范围
1.[abc] : 表示可能是a,可能是b,也可能是c。
2.[^abc]: 表示不是a,b,c中的任意一个
3.[a-zA-Z]: 表示是英文字母
4.[0-9]:表示是数字
简洁的字符表示
.:匹配任意的字符
\d:表示数字
\D:表示非数字
\s:表示由空字符组成,[ \t\n\r\x\f]
\S:表示由非空字符组成,[^\s]
\w:表示字母、数字、下划线,[a-zA-Z0-9_]
\W:表示不是由字母、数字、下划线组成
数量表达式
1.?: 表示出现0次或1次
2.+: 表示出现1次或多次
3.*: 表示出现0次、1次或多次
4.{n}:表示出现n次
5.{n,m}:表示出现n~m次
6.{n,}:表示出现n次或n次以上
逻辑表达式
1.XY: 表示X后面跟着Y,这里X和Y分别是正则表达式的一部分
2.X|Y:表示X或Y,比如"food|f"匹配的是foo(d或f),而"(food)|f"匹配的是food或f
3.(X):子表达式,将X看做是一个整体
传智Java培训拥有6大课程优势——http://www.itcast.cn/javaee/
①独有的一站式IT职业教育体系,让学员通过6个月的线下学习实现高起点就业, 12个月的线上在职进阶课实现升职加薪,大幅提升学员的职场晋升速度。
②60+套技术解决方案,覆盖职场常见开发问题,让学员就业后快速上手开发难题,轻松成为核心员工。
③超大项目库,覆盖7大就业主流热门行业,让学员边学习边积累项目开发经验。
④超千人投入的3大课程研发库,每年耗资千万打造领先行业的优质课程。
⑤传智&华为课程共建,持续为课程输出前沿技术。
⑥120+超强师资团队,多为总监、架构师出身,除了专业技能,还为你规划适合你的职业发展路线。
|