认知始于 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