目录
前言
正则表达式是很多应用场景都能使用到的语法,我们需要对数据进行分析的人对正则表达式的需求很高,所以我们得好好掌握,以便我们对数据进行分析,本教程适用于java、python、c/c++、PHP、Go、JS、C#等语言的正则表达式,大家都可以进行学习,本教程不进行更多语言拓展,仅对正则表达式进行讲解,后续会进行更深入的更新!
一、表达式基础用法
1.限定符
序号 | 字符 | 功能 |
---|---|---|
1) | ? | 表示它的前一个字符需要出现0次或者1次,即可有可无 |
2) | * | 表示它前一个字符出现0次或无限次,即可有可无 |
3) | + | 表示它前一个字符需出现1次以上 |
4) | {a} | 表示前一个字符需出现a次 |
5) | {a,b} | 表示前一个字符需出现a次到b次之间 |
6) | {a,} | 表示前一个出现a次或a次以上 |
1)"?"的使用
举个栗子,下面有一串字符
Hi, welcome to my company. Do you need a job
输入如下正则表达式
t?o
结果为
welcome
to
company
Do
you
job
该限定符的作用是前一个字符只需要出现0次或者1次,只寻找匹配的后一个字符
2)"*"的使用
举个栗子,下面有个文本
ab
abc
abccccccccc
acdd
输入如下正则表达式
abc*
结果为
ab
abc
abccccccccc
该限定符表示它前面的字符出现0次或无限次,即可以没有c,也可以有一次或很多次
3)"+"的使用
举个栗子,下面有个文本
ab
abc
abccccccccc
acdd
输入如下正则表达式
abc+
结果为
abc
abccccccccc
该限定符表示它前面的字符需出现1次以上的,可以看出与2)相比它少了个ab。
4)"{a}"的使用
举个栗子,下面有个文本
ab
abc
abcc
abccccccccc
acdd
输入如下正则表达式1
abc{1}
结果1为
abc
输入如下正则表达式2
abc{2}
结果2为
abcc
输入如下正则表达式3
abc{9}
结果3为
abccccccccc
该限定符表示前面的字符需要出现a次,所以也就不会匹配不符合的选项
5)"{a,b}"的使用
举个栗子,下面有个文本
ab
abc
abcc
abccccccccc
acdd
输入如下正则表达式
abc{2,9}
结果为
abcc
abccccccccc
该字符表示前面的字符需出现a次到b次之间,我们可以看到此时,仅出现2次到9次的内容
6)"{a,}"的使用
举个栗子,下面有个文本
ab
abc
abcc
abccccccccc
acdd
输入如下正则表达式
abc{2,}
结果为
abcc
abccccccccc
该限定符表示前一个出现a次或a次以上,即可出现2次或以上的内容
注意:该限定符的对象是一个字符,是一个字符,是一个字符!!!只能寻找它前面的字符
2.分组
字符:(多个字符)
功能:表示可以匹配括号内的多个字符为一组,后面可以添加限定符
"(多个字符)"的使用
举个栗子,下面有个文本
ab
abc
abcc
abcabcabc
acd
acddd
我们需要匹配ab在一起的多个字符为一组的数据,可以使用如下正则表达式
(ab)
结果为
ab
abc
abcc
abcabcabc
我们需要匹配多个ab为一组的数据,我们可以在它后面加上个+限定符
(ab)+
结果为
ab
abc
abcc
abcabcabc
3."或"运算符
字符:|
功能:匹配多个字符,与编程的逻辑运算符"或"相似
"|"的使用
a pen
a book
a room
例如我们需要匹配a pen或a book,我们需要输入如下正则表达式
a (pen|book)
结果为
a pen
b book
注意:要加上括号哦
4.字符类
字符:[字符]+
功能:表示匹配的字符只能取自于方括号中
"[字符]+"的使用
有如下文本
abcd
hello world
aaabbbcccddd
基本使用-取需要的字符
我们需要取到所有包含ab的字符
[ab]+
结果
ab
aaabbb
拓展使用-指定字符的范围
序号 | 字符 | 结果 |
---|---|---|
1 | [a-z]+ | 所有的小写英文字符 |
2 | [a-zA-Z]+ | 所有英文字符 |
3 | [a-zA-Z0-9]+ | 所有的英文字符和数字 |
4 | ^ | 在字符类中为脱字符,与逻辑运算的非差不多 |
5 | [^0-9]+ | 所有的非数字字符,包括换行符 |
5.元字符
序号 | 字符 | 功能 |
---|---|---|
1) | \d | [小写]数字字符(0-9) |
2) | \D | [大写]非数字字符 |
3) | \w | [小写]单词字符(英文、数字及下划线) |
4) | \W | [大写]非单词字符 |
5) | \s | [小写]空白符(包含空格、Tab和换行符) |
6) | \S | [大写]非空白符 |
7) | . | 任意字符(不包含换行符) |
8) | ^ | 匹配行首 |
9) | $ | 匹配行尾 |
10) | \b | [小写]匹配单词边界 |
11) | \B | [大写]匹配非单词边界 |
由于元字符较多,在此只做大致说明
8)"^"的使用
有如下文本
abcd
取行首的a的正则表达式为
a^
结果为
a
9)"$"的使用
有如下文本
abcd
取行尾的d的正则表达式为
d$
结果为
d
二、高级部分
1.贪婪与懒惰匹配
之前我们讲到的*、{}、+在匹配字符串的时候,默认会去匹配尽可能多的字符
例如有如下html代码
<html><head><meta charset="UTF-8"><title>hello world</title></head></html>
有如下正则表达式
<.+>
结果
<html><head><meta charset="UTF-8"><title>hello world</title></head></html>
在此可以看到该正则表达式会直接把整个字符串都全部匹配到,原因是因为中间的这个.+会匹配尽可能多的字符,这就是贪婪匹配
有如下正则表达式
<.+?>
结果
<html>
<head>
<meta charset="UTF-8">
<title>
</title>
</head>
</html>
由此我们可以看出,加上?后正则表达式会减少匹配的字符,它会将默认的贪婪匹配切换为懒惰匹配
三、实例
实例1-IP地址匹配
有如下文本
1234
255.255.0.0
259.255.255.0
192.168.1.1
0.0.0.0
hello world
111.111.0
在文本中提取所有出现的IPv4地址,我们可以使用如下正则表达式
\d+\.\d+\.\d+\.\d+
结果
255.255.0.0
259.255.255.0
192.168.1.1
0.0.0.0
分析
"\d+“会匹配任何长度大于1的数字,”\.“为”.“这个符号,因为”."在正则表达式中为特殊符号,需要用反斜杠进行转义,但我们会发现IP地址为0-255的数字,结果中的259.255.255.0显然已经超出范围,下面我们进行改良
如果正则表达式的前两位的值为25,那么第三位只能取0-5之间的数字
所以正则表达式为:
25[0-5]
但IP地址中的数字肯定不能只是25吧,所以我们需要用或来继续进行判断,如果第一位是2,第二位可以取0-4之间的值,第三位可以取0-9之间的值,我们可以用\d来表示
此时正则表达式为:
25[0-5]|2[0-4]\d
如果第一位为0-1之间的值,那么最后两位可以取00-99的任意数可以用\d\d代替,同时,我们指定ip地址可以有一位数,此时我们可以使用?限定符来表示它的可有可无,此时数字部分已经匹配完成,然后我们需要加上一个".“,然后我们需要进行3次重复匹配,最后的因为没有”."所以我们需要进行单独匹配,然后我们需要在首和尾加上字符边界来确保我们不好进行多余的匹配
所以最终的正则表达式为:
\b((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)\b
结果为:
255.255.0.0
192.168.1.1
0.0.0.0
实例2-RGB颜色值的匹配
有如下文本
#b2e0df
#ffffff
#4679ba
#000000
#FFFFFF
匹配文本中所有十六进制的RGB颜色值的正则表达式为
#[a-fA-F0-9]{6}\b
分析
我们需要a-f、A-F、0-9的字符,故我们需要字符类的范围,我们只需要六个字符故需要{6}限定符,为了防止匹配到多余字符,我们需要\b代表单词字符的边界。
结束
后续会更新更多案例,更多拓展,敬请期待哦!!