认知始于 Excel,不知道终于哪儿。
介绍与应用
属性:用于匹配和操作文本的工具
设计思想:用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,为“匹配”,反之,不“匹配”。
应用场景:
- 文本查找
- 文本替换
- 文本格式校验
- …
应用环境:大多数编程语言的标准库包含正则表达式的支持
- Python
- SQL
- Javascript
- Word, Excel…
语法
主要语法如下:
普通字符
明确的关键字:在正则表达式中直接写即可
- 文字字符:英文字母、中文、数字
- 符号:@ % _ 等等
特殊字符
一些有特殊含义的字符若要匹配,必须首先使字符”转义”,即将反斜杠字符 ``` 放在它们前面。
特殊字符 | 描述 |
---|---|
$ |
匹配输入字符串的结尾位置 |
() |
标记一个子表达式的开始和结束位置 |
* |
匹配前面的子表达式零次或多次 |
+ |
匹配前面的子表达式一次或多次 |
[ |
标记一个中括号表达式的开始 |
? |
匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。 |
\ |
将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符 |
^ |
匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。 |
{ |
标记限定符表达式的开始 |
| |
指明两项之间的一个选择 |
非打印字符
字符 | 描述 | 等效 |
---|---|---|
\cx |
匹配由x指明的控制字符 | |
\f |
匹配一个换页符 | \x0c 和 \cL |
\n |
匹配一个换行符 | \x0a 和 \cJ |
\r |
匹配一个回车符 | \x0d 和 \cM |
\s |
匹配任何空白字符,包括空格、制表符、换页符等等。 | \f \n \r \t \v |
\S |
匹配任何非空白字符 | ^ \f \n \r \t \v |
\t |
匹配一个制表符 | \x09 和 \cI |
\v |
匹配一个垂直制表符 | \x0b 和 \cK |
不需要记住,可用时查。
字符集合
单个关键字的值范围,包含在一对 []
中间。
应用:
- 明确某个字符的范围的模糊匹配
- 如果差异不仅仅在一个字符上,则不适合采用字符集合 -> 应采用子表达式
- 可以简化的连续值范围:使用
-
符号 - 字符集合为排除在外的值:使
^
符号
限定符、定位符
如下:
限定符
给前一个字符追加限定范围
常用限定符 | 描述 |
---|---|
* |
前面的字符/子表达式出现0次或多次 |
+ |
前面的字符/子表达式出现1次或多次 |
# |
前面的字符/子表达式出现0次或1次 |
{} |
前面的字符/子表达式出现具体{}次 |
注意:前面为模糊匹配范围时,会出现“贪婪匹配”的问题 – 默认情况下,正则表达式会匹配尽量多的字符 – 可通过添加 ?
实现非贪婪匹配。
定位符
标记匹配位置的元字符 - 只有4个:
定位符 | 描述 |
---|---|
^ |
字符串开始的位置 |
$ |
字符串结尾的位置 |
\b |
单词边界 - 字符与空格间的位置 |
\B |
非单词边界 |
子表达式
内嵌的子正则表达式,包含在一对 ()
中,可以看作是一个整体。
- 与正则表达式语法相同;
- 允许子表达式内嵌套子表达式;
- 用
|
分割多个子表达式/多种情况; - 可以标记子匹配项,如
([a-z])\1([a-z])\2
匹配aabb ... cczz
; - 子表达式的匹配结果会单独存储,如希望不存储,可以添加
?:
(在日常表达中不太常用); - 可作为预查匹配项/自定义的定位符;
省略符、修饰符
如下:
省略符
为了简化正则表达式的元字符,以 \
开头。
字符 | 描述 | 等效 |
---|---|---|
. |
匹配除换行符(\n 、\r )之外的任何单个字符 |
[^\n\r] |
\d |
匹配一个数字字符 | [0-9] |
\D |
匹配一个非数字字符 | [^0-9] |
\s |
匹配所有空白符,包括空格、制表符、换页符等。 | [\f\n\r\t\v] |
\S |
匹配所有非空白符 | [^\f\n\r\t\v] |
\w |
匹配一个字母、数字、下划线字符 | [A-Za-z0-9_] |
\W |
匹配一个非字母、数字、下划线字符 | [^A-Za-z0-9_] |
每个省略符都有替代方案,所以不必强求记忆。
修饰符
严格意义上不是正则表达式的一部分,是指定匹配策略的,可叠加使用。
常规修饰符 | 描述 |
---|---|
i |
ignore - 不区分大小写 |
g |
global - 全局匹配 |
m |
multi-line - 多行匹配 |
s |
默认情况下的圆点 . 是匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n 。 |
某些正则表达式的代码库可能存在特别的修饰符。
有些软件虽支持正则表达式搜索,但不一定开放修饰符的设置。
记不住语法的解决方案
正则表达式元字符手册:Road To Coding:正则表达式
在线测试正则表达式:Regular expression tester