贡献者: addis
1在文本文件中搜索内容的时候,有时候想要的是某种格式而不是某些具体的字符,例如要搜索 “*月*日 消费 ** 元”,找到匹配项后需要选中这几个字(以便进行替换等操作),又或者仅选中 “元” 前面的数值(以便进行统计等)。理论上我们可以通过编程解决这个问题,但更简单地,可以用一种广为使用的表达式来达到同样的效果,就是下面要介绍的正则表达式(regular expresion)。
正则表达式在许多软件中都被支持,例如在常用的文本编辑器(如 VScode),搜索软件(如 Fileseek),和大部分编程语言(如 C++,python,Matlab)中都有很好的支持。
| 符号 | 说明 | 例子 |
. | 匹配单个任意字符,包括空格回车等 | .at 可以匹配 bat,cat,hat 等
|
[...] | 匹配方括号中的任意一个字符。如果要表示一个范围的字符可以用 - 连接 | [bc]ase 可以匹配 base 和 case;又例如 [a-z0-9] 可以匹配任意一个小写字母或数字
|
[^...] | 匹配任何除方括号中以外的字符 | 例如 [^b]ase 不能匹配 base 但可以匹配 case
|
\w | 等效于 [a-zA-Z_0-9] | |
\W | 等效于 [^a-zA-Z_0-9] | |
\s | 空白字符,等效于 [ \f\n\r\t\v](注意第一个字符是空格,剩下的符号是不同功能的空格,见下文) | |
\S | 非空白字符,等效于 [^ \f\n\r\t\v] | |
\d | 一个数字(digit),等效于 [0-9] | |
\D | 一个非数字,等效于 [^0-9] |
\a Alarm (beep)
\b Backspace
\f Form feed
\n New line
\r Carriage return
\t Horizontal tab
\v Vertical tab
\特殊字符 例如 \? 表示问号,\* 表示星号,\\ 表示反斜杠
\oN 或 \o{N},用 8 进制指定字符
\xN 或 \x{N},用 16 进制指定字符
\ 变为 literal, 如 \\ 等
在表 1 的命令后面可以加上如下 quantifier
? 表示 0 或 1 次重复
+ 表示 1 或者若干次重复
* 表示 0 或者若干次重复
{n} 表示 n 次重复
{m,n} 表示 m 到 n 次重复
{m,} 表示 m 次或以上重复
? 可以匹配尽量短的内容,例如 abc.+?def
^ 行首
$ 行末
\< 单词开头(它之前不是 \w,但之后是)
\> 单词结尾(之前是 \w,之后不是)
(expr) 可以把表达式 group 到一起并 match,例如 abc(\d+)def 寻找 abc\d+def 并且 match \d+ 部分
$1,$2 等来表示。
(?:expr) 可以把表达式 group 到一起,例如 (?:abc){2} 搜索 "abcabc"
(expr1|expr2|expr3) 匹配其中一个
(?<!def)abc 可以匹配 abc 但是不允许前面是 def
(?<!def|efg)abc 可以匹配 abc 但是不允许前面是 def 或者 efg