贡献者: 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