目录
一、引言
在编程语言中,除了容器集合、多线程并发、IO流等等基础组件之外,还有一项专门处理字符串的“奇淫巧技”,这就是正则表达式。Perl语言正是凭借强大的正则表达式才异军突起的。
正则表达式是一种强大而灵活的文本处理工具。通过正则表达式,我们能够以编程的方式,构建复杂的文本模式,对输入的字符串进行搜索。一旦找到匹配的部分,我们就能随心所欲的对它们进行处理。
初学正则表达式时,它的语法是对初学者的一门考验,只有琢磨透了其真正的内涵,我们才能从本质上看到它确实是一种简洁、动态的语言。
本文主要分为三部分,第一部分主要是对正则表达式做一下简单的介绍,包括正则表达式的概念,应用场景,基本要素和一些字符等,第二部分正则表达式中的RE模块做简单的介绍,第三部分是举了几个使用正则表达式的简单例子。
二、正则表达式概述
除非你以前使用过正则表达式,否则你可能不太熟悉一些术语,但是毫无疑问,你已经是用过不涉及脚本的某些正则表达式概念,例如,你可以使用?通配符来查找硬盘上的文件?通配符匹配文件名中的0个或者一个字符,而*通配符匹配0个或多个字符。
在很多领域,正则表达式可以方便的提取我们想要的信息,所以正则表达式是一个很重要的知识点。
2.1概念
正则表达式是一种可以用于模拟匹配和替换的规范,一个正则表达式就是由普通字符以及特殊字符组成的文字模式,它用以描述在查找文字主体时代匹配的一个或者多个字符。正则表达式则为一个模板,将某个字符模式所搜索的字符串进行匹配。
Eg.简单举例:
- ^为匹配输入字符串的开始位置
- [0-9]+匹配多个数字,[0-9]匹配单个数字,+匹配一个或者多个
- Abc
匹
配
字
母
,
a
b
c
并
以
a
b
c
结
尾
,
匹配字母,abc并以abc结尾,
匹配字母,abc并以abc结尾,为匹配输入字符串的结束位置
2.2应用场景
- 验证:表单提交时,进行用户密码的验证
- 查找:从大量信息中快速提取指定内容,在一批url中,查找指定url
- 替换:将指定格式的文本进行正则匹配查找,找到后进行特定替换
2.3基本要素
- 字符类
- 数量限定类
- 位置限定类
- 特殊符号类
正则表达式基本是与语言无关的,我们可以结合语言/工具与正则表达式进行文本处理。
2.4字符
2.4.1普通字符
普通字符包括没有显式制定为元字符的所有可打印和不可打印字符,包括所有大写和小写字母,所有数字,所有标点符号和其他字符。
2.4.2非打印字符
2.4.3特殊字符
所谓特殊字符就是一些有特殊含义的字符,如runoob中的,简单的说就是表示任何字符串的意思,如果想要查找字符串中的符号,则需要对进行转义,即在其前加一个
许多元字符要求在试图匹配他们时特别对待,若要匹配这些特殊字符,必须首先使字符“转义”,即,将反斜杠字符\放在他们前面
2.4.4限定字符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*,+,?,{n,},{n,m}共六种。
2.4.5定位符
定位符使您能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。
定位符用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。正则表达式的定位符有:
2.4.6修饰符
正则表达式的修饰符用于指定额外的匹配策略,修饰符不写在正则表达式里而位于正则表达式外
2.4.7元字符
下表包含了元字符的完整列表以及它们在正则表达式上下文中的行为:
2.4.8运算符优先级
正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。
相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:
三、RE模块
正则表达式使用\对特殊字符进行转义,所以如果我们要使用原始字符串,只需加一个 r 前缀, e.g. r’chuanzhiboke\t.\tpython’
3.1re模块一般使用步骤
- 使用 compile() 函数将正则表达式的字符串形式编译为一个 Pattern 对象
- 通过 Pattern 对象提供的一系列方法对文本进行匹配查找,获得匹配结果,一个 Match 对象。
- 后使用 Match 对象提供的属性和方法获得信息,根据需要进行其他的操作
3.2compile函数
compile 函数用于编译正则表达式,生成一个 Pattern 对象,它的一般使用形式如下:
3.3Pattern对象
正则表达式编译成 Pattern 对象, 可以利用 pattern 的一系列方法对文本进行匹配查找了。
Pattern 对象的一些常用方法主要有:
- match 方法:从起始位置开始查找,一次匹配
- search 方法:从任何位置开始查找,一次匹配
- findall 方法:全部匹配,返回列表
- finditer 方法:全部匹配,返回迭代器
- split 方法:分割字符串,返回列表
- sub 方法:替换
match方法
match 方法用于查找字符串的头部(也可以指定起始位置),它是一次匹配,只要找到了一个匹配的结果就
返回, 而不是查找所有匹配的结果。它的一般使用形式:mach(string[,pos[,endpos]])
string 待匹配的字符串
pos 字符串的起始位置, 默认值是 0
endpos 字符串的终点位置, 默认值是 len (字符串长度)
3.4Match 对象
- group([group1, …]) 方法,用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或group(0);
- start([group]) 方法,用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
- end([group]) 方法,用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数 默认值为 0;
- span([group]) 方法,返回 (start(group), end(group))。
- search 方法,search 方法用于查找字符串的任何位置,它也是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有 匹配的结果,它的一般使用形式如下:
当匹配成功时,返回一个 Match 对象,如果没有匹配上,则返回 None。 - findall 方法,findall方法搜索整个字符串,获得所有匹配的结果。使用形式如下:
findall(string[,pos[,endpos]])
findall(string[,pos[,endpos]])
- finditer方法的行为跟findall的行为类似,也是搜索整个字符串,获得所有匹配的结果。但它返回一个顺序访问每一个匹配结果(Match对象)的迭代器。
- split 方法 split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:
(maxsplit 指定最大分割次数,不指定将全部分割.)
split(string[,maxsplit])
- sub方法,sub 方法用于替换。
四、正则表达式的简单使用
4.1判断邮箱地址是否合法
public class test01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//这里默认邮箱的后缀是.com或.net.cn
String str = "aa@aa.net.cn";
String regex = "\\w+@\\w+\\.(com|net.cn)";
System.out.println(str.matches(regex));
}
}
运行结果:
true
4.2用Pattern类进行字符串拆分
public class test02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "Tom:30|Jerry:20|Bob:25";
String regex = "\\|";
// Pattern pat = Pattern.compile(regex);
// String[] arr = pat.split(str);
String[] arr = str.split(regex);
for(String s:arr){
System.out.println(s);
}
}
}
运行结果:
Tom:30
Jerry:20
Bob:25
4.3. 用Matcher类进行字符串替换
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class test03 {
public static void main(String[] args){
String str = "12Y34h56dAd7";
String regex = "[a-zA-Z]+";
// Pattern pat = Pattern.compile(regex);
// Matcher mat = pat.matcher(str);
// System.out.println(mat.replaceAll(":"));
System.out.println(str.replaceAll(regex,"-"));
}
}
运行结果:
12-34-56-7
4.4 用Matcher类进行字符串验证
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class test02 {
public static void main(String[] args){
String str = "1234567abc";
String regex = "\\w{10,}";
// Pattern pat = Pattern.compile(regex);
// Matcher mat = pat.matcher(str);
// System.out.println(mat.matches());
System.out.println(str.matches(regex));
}
}
运行结果:
true
参考文献: https://www.cnblogs.com/xyou/p/7427779.html
https://www.jb51.net/article/16829.htm
https://www.bilibili.com/video/BV1wp4y1y7cJ?from=search&seid=4703093373384532657
https://blog.csdn.net/qq_18298439/article/details/88974940
https://blog.csdn.net/qq_41084324/article/details/83860173
https://blog.csdn.net/weixin_44259720/article/details/88179885