【1】为什么需要正则表达式(regular expresssion)?
针对于复杂文本的处理
【2】正则表达式的优势和用途
正则表达式是一种强大而灵活的文本处理工具,适用于大部分编程语言、数据库、文本编辑器、开发环境等
【3】正则表达式的定义
正则表达式定义文本的规则,可以通过该规则判断什么字符串符合规则
【4】开发中使用正则表达式的流程
1.分析所要匹配的数据,写出测试用的典型数据
2.在工具软件中进行匹配测试
3.在程序中调用通过测试了的正则表达式
【5】正则表达式测试工具Regexp buddy
【6】正则表达式语法
1.普通字符:字符、数字、字符串、下划线,以及没有特殊定义的标定符号,都是普通字符。正则表达式中的普通字符,在匹配字符串的时候,匹配与之相同的字符串
2.简单的转义字符
\n 代表换行符
\t 代表制表符(即键盘对应的Tab键)
\\ 代表“\”本身
\^,\$,\(, \), \{, \}, \?, \+, \*, \|, \[, \] 分表代表这些字符本身
3.标准的字符集合:能够与匹配范围规则内的字符相匹配,注意区分大小写,大小写是相互取反的意思
\d 0~9之间的任意一个数字
\w A~Z,a~z,0~9,_ 任意一个字母,数子或下划线(包括中文)
\s 包括空格、制表符、换行符等空白字符的其中任意一个
. 小数点可以匹配任意一个字符(除去换行),如果要匹配“\n”在内的所有字符,一般用[\s\S]
\D
\W
\S
4.自定义字符集合
[] 方括号匹配方式,可以匹配方括号中任意一个字符
[^...] 正则表达式的特殊字符,表示除了什么之外
[0-9] "-"表示从什么到什么,此处为0到9任意一个数字
[.]或[\.] 小数点在中括号中,只能匹配小数点
[标准集合] 标准集合在自定义集合中,标准集合会被包含进去
5.量词
{n} 正则表达式重复n次
{m,n} 至少重复m次,至多n次
{m,} 至少m次
? 表示{0,1}
+ 表示{1,}
* 表示{0,}
*量词的贪婪模式:默认情况,在量词允许的最大范围内,匹配最多的字符
*非贪婪模式:通过在量词后面加上"?"号,表示匹配最少的字符
6.字符边界:匹配的不是某个字符,而是符合某种条件的位置,称为零宽
^ 与字符开始的地方匹配
$ 与字符结束的地方匹配
\b 匹配一个单词边界,\前面的和后面的不全是\w类型的字符
7.正则表达式的匹配模式
1.ignorecase 忽略大小写模式,默认情况下区分大小写
2.singleline 单行模式,将整个文本看为一行,使得"."可以匹配包含换行符"\n"在内的字符
3.multiline 多行模式,每一行都是一个字符串,都有开头和结尾,切换为多行模式之后,可以使用\A,\Z表示文本的开始位置和结束位置
8.选择符和分组
|:分支结构 "|"左右两边表达式之间为"或"的关系,匹配左边或者右边,成立一边即可
():捕获组 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰;括号中的内容会被加载入内存,从1开始分配编号,使用 反向引用取结果时,这些内容可以被单独得到
(?:Expression):非捕获组 一些表达式中,不得不使用(),但又不需要保存()中子表达式匹配的内容,这时可以用非捕获组来抵消使用()带来的副作用, 如(?:[a-z]{2})
9.反向引用(\nnn)
*每一对()会分配一个编号,使用()捕获的根据左括号"("的顺序从1开始编号,因为捕获元素编号为0的第一个捕获,是由整个正则表达式匹配的文本。
*通过反向引用,可以对分组已捕获的字符串进行引用,如应用1号,即([a-z]{2})\1
10.预搜索(零宽断言|环视)
*零宽度,匹配内容不计入最终的匹配结果
* 表示一个位置是否满足需求
(?=exp) 断言自身出现的位置后面能匹配表达式exp
(?!exp) 断言自身出现的位置后面不能匹配表达式exp
(?<=exp) 断言自身出现的位置前面能匹配表达式exp
(?
【7】练习
一:电话号码验证
(1)电话号码由数字和"-"构成
(2)电话号码为7到8位
(3)如果电话号码中包含有区号,那么区号为三位或四位, 首位是0.
(4)区号用"-"和其他部分隔开
(5)移动电话号码为11位
(6)11位移动电话号码的第一位和第二位为"13“ , ”15” , ”18”
示例:0\d{2,3}-\d{7,8}135789\d{9}
二:电子邮件地址验证
1.用户名:字母、数字、中划线、下划线组成。
2.@
3.网址:字母、数字组成。
4. 小数点:.
5. 组织域名:2-4位字母组成。 – 不区分大小写
示例:\w\-\w+\.a-zA-Z{2,4}{1,}
【8】常用正则表达式
【11】其它妙用
开发环境和文本编辑器
eclipse
Notepad++
Editplus
UltraEdit
数据库
select * from student_manager where name regexp '.666';
Java中使用正则
相关类位于:java.util.regex包下面
*类Pattern:
正则表达式的编译表示形式
*Pattern p = Pattern.complie(r,int); //建立正则表达式,并启用相应模式
*类Matcher:
通过解释Pattern对character sequence 执行匹配操作的引擎
*Matcher m = p.matcher(str); //匹配str字符串
【12】实战
# idea基本操作
1.创建正则表达式的规则
Pattern p = Pattern.compile("正则表达式");
2.输入字符序列
Matcher m = p.matcher(String str);
3.Matcher中的方法
m.matches();//尝试将整个字符串序列与该模式匹配
m.find();//该方法扫描输入的序列,查找与该模式匹配的下一个子序列
m.group(int status);//将符合条件的字符返回,根据正则表达式的'()'分组,超过组数,说则状态<0,会抛出异常
m.replaceAll("想要替换的字符");//将符合正则表达式的全部替换
分割的运用:
String str = "a123b12314c134d";
String[] split = str.split("\\d+");
System.out.println(Arrays.toString(split));
#网络爬虫模拟 wget
要求:获得一个网页中所有的超链接href="xxx";
public class Wget {
//在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。
//同时,Pattern要定义为static final静态变量,以避免执行多次预编译
private static final Pattern pattern = Pattern.compile("href=\"([(hppts:)(http:)]([\\w.:/?\\-=]+))\"");
public static void main(String[] args) {
List
for (String href : hrefs) {
System.out.println(href);
}
}
public static List
URL u;
List
StringBuilder sb = new StringBuilder();
try {
u = new URL(URL);
BufferedReader br = new BufferedReader(new InputStreamReader(u.openStream(), Charset.forName(character)));
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
Matcher matcher = pattern.matcher(sb.toString());
while (matcher.find()) {
list.add(matcher.group(1));
}
return list;
}
}