根据正则表达式 – 语法 | 菜鸟教程 (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/#