正则表达式
为什么我们要学习正则
自然语言处理是计算机程序的重要组成部分,而正则表达式则是处理文本的利器,通过设置合适的正则表达式,可以快速处理文本,从而提高工作的效率。
本节课的逻辑架构
正则表达式的处理模式
我们先看一串正则表达式的标准处理代码:
String content = "2019年是一个特殊的日子,在该年年末,新冠疫情爆发,于是,2019年又被称为最后一个黄金年代。";
//1.创建正则表达式(匹配4个数字)
String regStr = "(\\d\\d\\d\\d)";
//2.创建正则表达式对象
Pattern pattern = Pattern.compile(regStr);
//3.创建匹配器matcher
Matcher matcher = pattern.matcher(content);
//4.开始匹配
while(matcher.find()){//默认为贪婪匹配
System.out.println("匹配成功,匹配到的值为:"+ matcher.group(0));
}
从上程序可以看出:正则表达式的处理分为3步:创建正则表达式对象-使用表达式对象的matcher方法创建匹配器,再使用matcher的find方法进行匹配。
这时候就出现了一个问题:为什么匹配要使用find方法呢,还有group(0)代表什么意思?这就引入了下一个部分:正则表达式的底层实现
正则表达式的底层实现
首先来分析find()和group()的底层源码
//find()方法最后调用的方法
boolean match(Matcher matcher, int i, CharSequence seq) {
matcher.last = i;
matcher.groups[0] = matcher.first;
matcher.groups[1] = matcher.last;
return true;
}
//匹配整个的正则表达式
起点:group[0] = 0(开始的索引)
终点:group[1] = 4(结束的索引+1)
//当出现分组的情况时
记录 1 组()匹配到的字符串 groups[2] = 0 groups[3] = 2
记录 2 组()匹配到的字符串 groups[4] = 2 groups[5] = 4
//group()的底层源码
public String group(int group) {
if (first < 0)
throw new IllegalStateException("No match found");
if (group < 0 || group > groupCount())
throw new IndexOutOfBoundsException("No group " + group);
if ((groups[group*2] == -1) || (groups[group*2+1] == -1))
return null;
return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();//返回起点和终点的字符串(这里配合find方法设下的索引)
}
我们可以看到find()方法不仅实现了逻辑上的判断,并且对于分组方法进行了索引;而group()方法这就是根据分组情况来取字符串。
为什么find()和group()方法不作为一个方法呢
这就是Java的妙处,一个方法的代码耦合性太高,所以一个代码用来分组设置索引,一个方法用来根据索引来获取字符串,这样就实现了低耦合。
正则表达式的基础语法介绍
-
转义字符
-
字符匹配符
- 限定符
- 定位符
这些语法不需要特意去记,根据需求来进行选择就好
String regStr ="^[0-9]+\\-[a-z]+$"
//至少一个数字开头,至少一个小写字母结束
正则表达式的高阶应用
反向引用是建立在分组和捕获的基础上的
匹配5个连续的相同数字:(\\d)\\1{4}(这里的\\1就是对于第一个组的反向引用)
匹配个位与千位相同,十位与百位相同的数:(\\d)(\\d)\\2\\1
String content = "我....我要....学学学学....编程 java!";
//匹配的语句
content = Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1");
String类中正则表达式的使用
- 替换功能
public String replaceAll(String regex,String replacement)
- 判断功能
public boolean matches(String regex){}
- 分割功能
public String[] split(String regex)
正则表达式示例
验证电子邮件是否合法
需求:
1.只能有一个@
2.@前面是用户名,可以是a-z,A-z,0-9,-_字符
3.@后面是域名,域名只能是英文字母(且点不确定)
//直接用字符串的matches匹配比较好
Scanner scanner = new Scanner(System.in);
System.out.println("请输入想要匹配的字符串:");
String string = scanner.next();
//匹配的正则表达式
String req = "^[0-9a-zA-Z_-]+@([a-zA-Z]+\\.)+[a-zA-Z]+$";//这里匹配一个代码块就用()分组包起来
if(string.matches(req)){
System.out.println("匹配成功,是邮箱");
}else{
System.out.println("格式不正确!");
}
标签:group,String,匹配,正则表达式,matcher,Robyn,groups,Java
From: https://www.cnblogs.com/robyn2022/p/16726765.html