正则表达式【基础篇】

114 阅读4分钟

最近在复习数据结构和算法的过程中发现,在做字符串相关的算法题的时候,总是会涉及到正则表达式的知识,并且在做字符串类型题目的时候,使用正则表达式,能大大提高程序的可读性。因此回顾正则表达式的知识,并整理了一篇基础笔记。

2.8更新 Road 2 Coding (r2coding.com) 刚发现的一个学习网站,上面有正则表达式的记忆手册以及正则表达式的可视化工具。

正则表达式所作的事情就是帮忙匹配指定规则的字符串

应用

代码中的关键字匹配、密码复杂程度判定、爬虫中提取指定信息 ...

正则测试平台

regex101: build, test, and debug regex 该网站可以在线测试正则表达式。

常用限定符

? —— 0/1

问号? 表示问号前面这个字符出现0/1次,简单来说就是问号前的这个字符可有可无

  • input => resumes? 表示s可有可无

  • match => resume 或者 resumes

1707319338567.png

* —— 0 /1/多

星号* 表示星号前面这个字符出现0或者1或者更多次。

  • input => ab*c 表示b可以不出现,也可以出现,也可以出现多次

  • match => ac 或者 ab(bbb...)c

1707319846347.png

+ —— 1/多

加号+ 表示加号前面这个字符出现1或者更多次。也就是一定要起码出现一次了。

  • input => ab+c 表示b至少要出现一次。

  • match => abc 或者 ab(bbb...)c

1707320002819.png

{n} —— 精确匹配n个

花括号中的数字n表示精确匹配该花括号前字符出现的次数。

  • input => ab{6}c 表示b要出现6次。

  • match => abbbbbbc

1707322287464.png

【1】范围匹配{a,b} —— 指出现a次以上,b次以下

【2】{a,} —— 指出现a次以上

()括号 —— 组合字符串

可以发现,在我们使用之前讲的运算符的时候,都是只限定了限定符之前的那一个字符串

现在使用()括号,将限定符的几个字符括起来,表示一个整体的限定。

1707322721219.png

[]方括号 —— 或

表示方括号中的内容只要至少出现一个就好。

  • input => `[ab]+ 表示a或b只要出现1/多次以上就好

  • match =>

1707324136298.png

^取反

匹配除了尖号后面列出的以外的字符。

[^0-9]表示所有的非数字

在正则表达式中,[a-z]表示所有的小写字母,[A-Z]表示所有的大写字母,[0-9]表示所有的数字。当然我们也可以一起写:[a-zA-Z0-9]+意思就是字母或者数字出现1次或以上就好。

元字符

正则表达式中大部分的元字符都是以反斜杠开头的:

\d表示数字字符 ==> 等同于[0-9]

\D表示非数字字符

\w表示所有的单词字符(也就是所有的单词、数字以及下划线)

\W表示非单词字符

\s表示空白符(包含空格、Tab和换行符)

\S表示非空白字符

. 句点表示任意除换行符之外的所有字符

^ 尖号只匹配行首 例如:^a只会匹配行首的a

$ 美元符号只匹配行尾 例如:$a只会匹配行尾的a

关于这些元字符,如果我们在匹配时,需要匹配的就是这些字符本身,也就是 . ^ $那么记得要在它们之前使用反斜杠\ 做转义。

贪婪匹配与懒惰匹配

贪婪匹配

贪婪匹配,也就是匹配尽可能多的字符。

例如,我想匹配html字符,也就是这里的<span></span><p></p>

因此,使用<.+> <>是必要的 里面是.句号 匹配除换行符之外的所有字符

1707382182818.png

但是我们会发现,由于正则表达式默认的贪婪匹配,所有字符都被匹配到了;这是因为这里的.句号也会匹配到>

懒惰匹配

我们可以通过添加一个问号? 来将默认的贪婪匹配切换为懒惰匹配。

1707382534581.png

实例分析

颜色值匹配

匹配文本中出现的所有十六进制RGB颜色值。

1707382817544.png

\b 表示单词字符的边界,这样可以防止超出6个字符的也被匹配到。

总结

1707383289316.png

本文是学习b站作者大大——奇乐编程学院的视频笔记:10分钟快速掌握正则表达式_哔哩哔哩_bilibili