目录
第一个例子
package dao.impl;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author 小李
* @version 1.0
* 体验正则表达式的威力,给我们的文本处理带来那些好处
*/
public class Regexp {
public static void main(String[] args) {
//假设,编写了爬虫,从百度页面得到如下文本
String content = "建国初期,我们在小学教科书中崇拜那些为国家做出巨大贡献的人。来自黄继光、邱少云、雷锋和其他人的故事是必不可少的。" +
"他们要么为新中国流血,要么为新中国的早期建设做出了巨大贡献。这自然值得学习。许多英雄故事被囊括在教科书中,供孩子们study。" +
"但在此案中,一名man故意杀人,却以卑鄙的方式把自己打造成“人民英雄”,还登上了小学教科书。" +
"这个人叫刘学保。他看到了一个流传广泛的英雄故事,觉得这种受到尊重和钦佩的感觉特别好。从此他开始走向邪恶的道路,依靠预谋杀人来伪造证据。" +
"他把自己伪装成人民英雄,也受到人们的钦佩。然而,经过four year的研究和专家的考察,他的谎言最终弄巧成拙,成为了历史上的罪人,永远逃脱不掉杀人凶手的身份";
//提取文章中的单词
//1.传统方法。使用遍历方式,代码量大,效率不高。
//2.正则表达式技术
//1.先创建一个pattern模式对象,模式对象,可以理解为一个正则表达式对象
Pattern pattern = Pattern.compile("[a-zA-Z]+");
//2.创建一个匹配器对象,就是matcher匹配器按照 pattern(模式/样式),到content文本中去匹配。找到就返回true,否则false
Matcher matcher = pattern.matcher(content);
//开始循环匹配
while(matcher.find()){
//匹配内容,文本,放到m.group(0)
System.out.println("找到:"+matcher.group(0));
}
}
}
为什么要学习正则表达式?
1.处理文本的利器
2.登录界面的密码,账号,邮箱,手机号码等的验证
正则表达式的底层实现
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegTheory {
public static void main(String[] args) {
String context = "1998建国初期,我们在小学教科书中崇拜那些为国家做出巨大贡献的人。来自黄继光、邱少云、雷锋和其他人的故事是必不可少的。\" +\n" +
" \"他们要么为新中国流血,要么为新中国的早期建设做出了巨大贡献。这自然值得学习。许多英雄故事被囊括在教科书中,供孩子们study。\" +\n" +
" \"但在此案中,一名man故意杀人,却以卑鄙的方式把自己打造成“人民英雄”,还登上了小学教科书。\" +\n" +
" \"这个人叫刘学保。他看到了一个流传广泛的英雄故事,觉得这种受到尊重和钦佩的感觉特别好。从此他开始走向邪恶的道路,依靠预谋杀人来伪造证据。\" +\n" +
" \"他把自1111己伪装成人民英雄,也受到人们的钦佩。然而,经过four year的研究和专家的考察,他的谎言最终弄巧成拙,成为了历史上的罪人,永远逃脱不掉杀人凶手的身份";
//匹配规则匹配所有的四个数字
String regString = "\\d\\d\\d\\d";
//创建模式对象
Pattern pattern = Pattern.compile(regString);
//创建匹配器matcher,按照正则表达式的规则,去匹配content字符串
Matcher matcher = pattern.matcher(context);
//开始匹配
while(matcher.find()){
System.out.println(matcher.group(0));
}
}
}
matcher.find() 完成的任务(考虑分组):
什么是分组?
String regString = "(\\d\\d)(\\d\\d)";
group函数传值(0或者1或者2.............)这涉及到分组,正则表达式中有()表示分组,第一个()表示第一组,第二个()表示第二组。
1.根据指定的规则,来定位满足规则的子字符串(比如1998)
2.找到后,将子字符串的开始的索引记录到matcher对象的int[] group属性中(如果之前执行过一次,下一次就会清空该数组,可以又下面断点调试证明)
2.1 把该子字符串开始的索引记录到group[0] = 0,;把该子字符串的结束的索引+1的值记录到group[1]=4
2.2 记录1组()匹配到的字符串group[2] = 0; group[3] = 2
2.3 记录2组()匹配到的字符串group[4] =2;group[5] = 4;
2.4 如果有更多的分组。。。。,可以继续
3.同时记录oldlast的值为子字符串的结束的索引+1值为4,即下次执行find时候就从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 getSubSequen