入门介绍
需求:提取文本中某类字符
传统方法:遍历每个字符,判断其是否在ASCII码中某种类型得编码范围内,代码量大,效率不高
正则表达式(RegExp, regular expression):处理文本的利器,是对字符串执行模式匹配的技术。java\javascript\php等语言都支持。
//假设爬虫获取内容
String content = "...";
//1 先创建一个Pattern模式对象,即一个正则表达式对象
//提取所有英文单词
Pattern pattern = Pattern.compile("[a-zA-Z]+");
//提取所有数字
Pattern pattern = Pattern.compile("[0-9]+");
//提取所有数字和英文单词
Pattern pattern = Pattern.compile("([0-9]+)|([a-zA-Z]+)");
//提取百度热搜的标题
Pattern pattern = Pattern.compile("<a target=\"_blank\" title=\"(\\S*)\"");
//提取文本中的ip地址
Pattern pattern = Pattern.compile("\\d+\\.\\d+\\.\\d+\\.\\d+")
//2 创建一个匹配器对象,按照模式到content中匹配,找到返回true,否则false
Matcher matcher = pattern.matcher(content);
//3 开始循环匹配
while (matcher.find()) {
//匹配内容,文本,放到m.group(0)
System.out.println("找到:" + matcher.group(0)); //热搜标题使用group(1)
}
正则底层实现
matcher.find()
:定位满足指定规则的字符串,将找到的子字符串的开始缩影记录到matcher的属性int[] groups中groups[0];把结束索引+1的值记录到groups[1],同时记录为oldLast的值,作为下次find开始的位置。
group(int group)
:根据groups[2 * group]和groups[2 * group + 1]从content截取字符串(前闭后开)并返回。
String regStr = "\\d\\d\\d\\d"; //4个任意数字
group(0) //返回content中[group[0], group(1))的子字符串
String regStr = "(\\d\\d)(\\d\\d)"; //表示分组1和2
//另外还会把第1组匹配到的子字符串的开始索引和结束索引+1的值记录到group[2]和group[3];第2组对应值记录到group[4]和group[5]...
group(0) //返回匹配到的子字符串,content中[group[0], group(1))的子字符串
group(1) //返回匹配到的子字符串中的第1组,content中[group[2], group[3])的子字符串
group(2) //返回匹配到的子字符串中的第2组,content中[group[4], group[5])的子字符串
基本语法
元字符
转义符\\
使用正则表达式去检索某些特殊字符的时候,需要用到转义符号,如:. * + ( ) $ / \ ? [ ] ^ { }
。Java正则表达式中\\
代表其它语言中的一个\
。
字符匹配符
选择匹配符
限定符
指定其前面的字符和组合项连续出现多少次
分组组合和反向引用符
特殊字符
定位符
※三个常用类
Pattern
Matcher
PatternSyntaxException
※分组、捕获、反向引用
※元字符
应用实例