正则表达式

                     

贡献者: addis

  • 本文处于草稿阶段。
预备知识 文本文件与字符编码

  1在文本文件中搜索内容的时候,有时候想要的是某种格式而不是某些具体的字符,例如要搜索 “*月*日 消费 ** 元”,找到匹配项后需要选中这几个字(以便进行替换等操作),又或者仅选中 “元” 前面的数值(以便进行统计等)。理论上我们可以通过编程解决这个问题,但更简单地,可以用一种广为使用的表达式来达到同样的效果,就是下面要介绍的正则表达式(regular expresion)

   正则表达式在许多软件中都被支持,例如在常用的文本编辑器(如 VScode),搜索软件(如 Fileseek),和大部分编程语言(如 C++,python,Matlab)中都有很好的支持。

字符匹配

表1:字符匹配
符号 说明 例子
. 匹配单个任意字符,包括空格回车等 .at 可以匹配 batcathat
[...] 匹配方括号中的任意一个字符。如果要表示一个范围的字符可以用 - 连接 [bc]ase 可以匹配 basecase;又例如 [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]

重复匹配

   在表 1 的命令后面可以加上如下 quantifier

Anchors

Group

例 1 

  • 要搜索例如 error=1.23e-13 格式的字符串,且找出最大的 error。可以先搜索 error=.*?e-13,手动把 -13 依次替换为 -12 等,直到没有结果。例如最大的指数时 e-10,然后再尝试 error=9\..*?e-10error=8\..*?e-10 等。其中 \. 是小数点,.*? 匹配任意多的字符且尽可能少。
  • 在 VS code 中,要把 [链接名](网址) 替换为 \href{\%E7\%BD\%91\%E5\%9D\%80}{链接名},搜索正则表达式 \[(.*?)\]\((.*?)\),替换为为 \href{$2}{$1}
  • 例如 c[aeiou]+t 可以匹配 cat, coat 等. 其中 [aeiou] 代表 aeiou 中的任意一个, + 代表 aeiou 可以出现多次.
  • ^M\w* 匹配行首以 M 开头的一个单词, 包括 M
  • \w*m$ 匹配行末以 m 解为的一个单词, 包括 m
  • \<n\w* 匹配任何以 n 开头的单词
  • \w*e\> 匹配任何以 e 结尾的单词

1. ^ 参考 Matlab 文档相关页面

                     

© 小时科技 保留一切权利