前言

正则表达式有些很难记住的理论,在这里一次性整理一下,帮助更深刻一点的掌控。

正则表达式是什么

正则表达式可以把它看做是一种通配符的增强版,它可以帮你匹配你想要的字符串。

在很多地方可以用到正则表达式,比如编译器中的词法分析器、网址上的注册表单、爬虫中用正则表达式来提取信息等等。所以我们可以更加深刻地理解正则表达式的用处之广,好多地方都不能缺少它。

以下是正则表达式正式内容,一些最基础的用法。

限定符

限定符是一类特殊的字符,以下归纳:

符号 含义 例子
? 表示之前的字符出现零次或者一次 end? –> 表示en或者end
* 表示之前的字符出现零次或者多次 end* –> 表示en或者enddddd 都行
+ 表示之前的字符出现一次或者多次 end+ –> 表示end或者endddddd
{…} 之中可以精确表示字符出现的次数 en{2}d –> 表示ennd en{2,3}d –> 表示ennd或者ennnd

如果想要限定多个运算符,比如ab,就直接打上括号再添加符号就行了,比如(ab)? 就表示 ab 或者空字符串。

“或”运算符

符号 含义 例子
| 两者之间的取或 a (cat|dog) –> a cat 或者 a dog

字符类

符号 含义 例子
[…] 匹配 […] 中的所有字符 [abc] 会匹配所有字符串中的a,b,c 的字符
[^…] 表示匹配除了[…]中字符以外的所有字符串 [^abc]会匹配所有字符串中除了a,b,c 的字符

注:[a-z]表示所有的小写字符,[A-Z]表示所有大写字符,[a-zA-Z0-9]表示所有的英文字符和数字

[^0-9]表示所有的非数字字符(包括换行符)

元字符

元字符是一组正则表达式中预先定义好的一系列常用字符类型,比如数字、空白符、单词开头、单词结尾等。这些元字符中的大多数以反斜杠\ 开头

符号 含义
\d 所有数字字符,等同于[0-9]
\w 单词字符,表示所有英文字符、数字和下划线
\s 空白符,包含tab字符以及换行符
\D 表示所有非数字字符
\W 表示所有非单词字符
\S 表示所有非空白字符
. 表示所有任意的字符(不包括换行符)
^ 匹配行首,^a 表示匹配所有行首的a
$ 匹配行尾,a$表示匹配所有行尾的a

贪婪匹配和懒惰匹配(lazy match)

之前讲述?+{}之类的限定符的时候,都是默认匹配尽可能多的字符

比如我想要限定HTML文本中的字符串:

1
<p> this is an example <p>

我们使用<.*> 来进行匹配,结果匹配下来的字符串会是:

1
<p> this is an example <p>

因为默认的贪婪匹配(greedy match)会匹配尽可能多的字符串,所以匹配了第一个

的左边”<”和第二个

右边的”>” 中间的所有字符串

解决方法:

使用<.*?>来讲贪婪匹配(greedy match)变成懒惰匹配(lazy match)

这样的话,匹配出来的字符串就会变成”p”和”p”两个标签

参考视频:https://www.bilibili.com/video/BV1da4y1p7iZ?from=search&seid=10813203089957646846