正则表达式详解

【1】为什么需要正则表达式(regular expresssion)?

针对于复杂文本的处理

【2】正则表达式的优势和用途

正则表达式是一种强大而灵活的文本处理工具,适用于大部分编程语言、数据库、文本编辑器、开发环境等

【3】正则表达式的定义

正则表达式定义文本的规则,可以通过该规则判断什么字符串符合规则

【4】开发中使用正则表达式的流程

1.分析所要匹配的数据,写出测试用的典型数据

2.在工具软件中进行匹配测试

3.在程序中调用通过测试了的正则表达式

【5】正则表达式测试工具Regexp buddy

正则表达式详解_第1张图片

【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】常用正则表达式

正则表达式详解_第2张图片

【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 hrefs = getHrefs("https://www.163.com", "GBK");

for (String href : hrefs) {

System.out.println(href);

}

}

public static List getHrefs(String URL, String character) {

URL u;

List list = new ArrayList();

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;

}

}

你可能感兴趣的:(正则表达式)