前言
正则表达式有些很难记住的理论,在这里一次性整理一下,帮助更深刻一点的掌控。
正则表达式是什么
正则表达式可以把它看做是一种通配符的增强版,它可以帮你匹配你想要的字符串。
在很多地方可以用到正则表达式,比如编译器中的词法分析器、网址上的注册表单、爬虫中用正则表达式来提取信息等等。所以我们可以更加深刻地理解正则表达式的用处之广,好多地方都不能缺少它。
以下是正则表达式正式内容,一些最基础的用法。
限定符
限定符是一类特殊的字符,以下归纳:
符号 | 含义 | 例子 |
---|---|---|
? | 表示之前的字符出现零次或者一次 | 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文本中的字符串:
<p> this is an example <p>
我们使用<.*> 来进行匹配,结果匹配下来的字符串会是:
<p> this is an example <p>
因为默认的贪婪匹配(greedy match)会匹配尽可能多的字符串,所以匹配了第一个
的左边"<“和第二个
右边的”>" 中间的所有字符串
解决方法:
使用<.*?>来讲贪婪匹配(greedy match)变成懒惰匹配(lazy match)
这样的话,匹配出来的字符串就会变成"p"和"p"两个标签
参考视频:https://www.bilibili.com/video/BV1da4y1p7iZ?from=search&seid=10813203089957646846.