好物分享第13弹:正则表达式简明学习指南

2021-12-17 10:02:40 浏览数 (1)

根据正则表达式 – 语法 | 菜鸟教程 (runoob.com)[1] 描述:正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

借助正则表达式,我们可以用简单的字符组合,实现多个文本内容的表达:PY{:3}N可表示 PN PYN PYYN PYYYN

1)选择

可以通过竖直分隔符用于选择,比如 boy|girl 匹配boy 或girl。

2)数量限定

代码语言:javascript复制
* # 星号代表前面的字符可以不出现,也可以出现一次或者多次(0 次、或 1 次、或多次),
# 例如,“0*42”可以匹配 42、042、0042、00042 等。

? # 表示前面的字符最多出现一次(0 次或 1 次)

  # 表示前面的字符必须出现至少一次(1 次或多次)

此外,还有:

代码语言:javascript复制
. 表示任何单个字符
{m},扩展前一个字符串m次;ab{2}c,表示abbc。
{m,n},扩展前一个字符串m 到n次;ab{1,2}c,表示abc,abbc。

3)范围与优先级

()圆括号可以用来定义模式字符串的范围和优先级,这可以简单的理解为是否将括号内的模式串作为一个整体。例如,"gr(a|e)y"等价于"gray|grey",(这里体现了优先级,竖直分隔符用于选择 a 或者 e 而不是 gra 和 ey),"(grand)?father"匹配 father 和 grandfather(这里体现了范围,?将圆括号内容作为一个整体匹配)。

4)限定范围

代码语言:javascript复制
[] 对单个字符给出取值范围;[abc]表示a或b或c,[a-f]表a-f中的任意一个字符串。
[^ ],与[]相反,指取值范围以外字符;[^abc]表示非a非b非c。

. 表示任何单个字符
^,表示字符串开头部分;^abc,匹配abc 开头的字符串。
$,匹配字符串结尾;abc$,匹配abc 结尾的字符串。

5)语法

由于正则表达式存在多种不同的语法(类似于方言的赶脚),而主要学习的是PCRE 子集,其适用于perl和python编程语言及grep或egrep的正则表达式匹配规则。

PCRE(Perl Compatible Regular Expressions 中文含义:perl 语言兼容正则表达式)是一个用 C 语言编写的正则表达式函数库,由菲利普.海泽(Philip Hazel)编写。PCRE 是一个轻量级的函数库,比 Boost 之类的正则表达式库小得多。PCRE 十分易用,同时功能也很强大,性能超过了 POSIX 正则表达式库和一些经典的正则表达式库。

额外补充一些:

代码语言:javascript复制
d 数字,等价于[0-9]
D 非数字。
w 单词字符,等价于[A-Z], [a-z], [0-9] 及 -。
W 非单词字符。
t 制表符。
n 空行。
s 空格型内容,如t, n等。
S 非空格。

优先级

image.png

总结

实验楼真的很良心了:

小练习

第一题:

? 表() 部分出现0或1次,因此对应字符串为 PN, PYN, PYTHN,PYTHON

第二题:

PYTHON 可表示 PYTHON PYTHONN PYTHONNN ... ...

第三题:

PY{:3}N可表示 PN PYN PYYN PYYYN

经典正则表达式

1)^[A-Za-z] ,匹配开头结尾之间的,也就是任意数目的二十六个大小写字母组成的字符串。可以再加上数字,^[A-Za-z0-9] 2)整数的字符串如何表示呢?^-?d

设计正则表达式

匹配IP地址的正则

IP地址分四段,每段为 0-255,比如111.111.111.111(([1-9]?d|1d{2}|2[0-4]d|25[0-5]).){3}([1-9]?d|1d{2}|2[0-4]d|25[0-5]) 将每段0-255 用分组标记及或字符,进行表达,包括0-99|100-199|200-249|250-255,四段。将该分组再扩展为四段,其中前三段的末尾有. 。

学习资源

如果想要练习自己的正则表达式掌握情况,可以在这个网站进行练习:https://regex101.com/[2]它不仅会检验你的正则在文字中的结果,并返回匹配的值:

还可以进行语法的检查:

如果你希望将正则使用的代码保存,也支持多种语法的输出:

但缺点是这个网站对于境内用户不是很友好,还有另外一个可以满足正则检查基本功能的网站:https://tool.oschina.net/regex/#[3] 它也提供了一些常用正则表达式的语法,可以结合使用。

参考资料

[1]正则表达式 – 语法 | 菜鸟教程 (runoob.com): https://www.runoob.com/regexp/regexp-syntax.html

[2]https://regex101.com/: https://regex101.com/

[3]https://tool.oschina.net/regex/#: https://tool.oschina.net/regex/#

0 人点赞