跳转至

通配符与正则表达式

通配符与正则表达式

更新日期:2020-07-24


1. 概述

通配符与正则表达式都是用来进行文本匹配的工具语言。
本着简单既是完美的原则,我将扔掉那些复杂的语法,只在有限的场景下使用最简单的语法完成我们要做的事情。 记住,复杂的东西会成为一种负担,会让我们的生活变得不美好。

具体来说就是:

原则

  • (1) 只使用最常用的符号
  • (2) 只写最简单的正则表达式
  • (3) 只使用通用的语法和符号

关于(3),由于正则表达式在各个地方的实现不太一样,又分好几种引擎。所以有的写法并不通用。

2. 通配符

2.1 使用场景

最常见的使用场景是:

  • 在资源管理器中查找文件
  • 在命令行结果中筛选数据

SQL中的like语句中使用的通配符由于语法不一样,所以不做讨论。

2.2 语法

为了最简化的使用通配符,我只使用一个符号:*。没错,连?都不要了,因为我几乎从来都没有必要去使用它。

使用的方式也很简单粗暴。

  • *hello* 任意匹配
  • get* 开头配备
  • *.exe 结尾匹配

3. 正则表达式

3.1 使用场景

常见的使用场景

  • 从大段文本中按固定格式查找文本
  • 检查电话号码、密码格式等
  • 在一些软件的配置文件中作为可变的配置值

不建议的使用场景

  • (1) 在程序中使用带有分支的长正则表达式匹配文本,比如IP和邮箱。想测试或者修改的时候会成为噩梦,而且性能通常难以保证。
  • (2) 你想使用正则表达式解决问题,但感觉必须查询手册教程,一时三刻写不出来的时候。问题比较复杂的时候,直接使用高级语言或脚本语言的语法来解决是更好的办法。

3.2 语法精简

正则表达式中有很多的术语和符号。为了避免记忆,可以做出精简,很多时候我们并不需要这么复杂的功能。 特别是像分支这样的功能,我觉得完全就是浪费生命。 这里简单的列了几张表,希望使用的时候花十来秒钟查一下表就能用出来。

精简符号列表

符号 含义
\w 匹配常见字符(字母、数字、下划线、汉字、日文等)
\d 匹配数字
\s 匹配空白字符
. 匹配任意字符(换行符除外)
\W 反向匹配\w以外的字符
\D 匹配非数字
\S 匹配非空白字符

转义符号列表

符号 含义
\t 匹配Tab
\n或\r\n 匹配换行符(根据文本具体使用的换行符种类来指定)
\\ 匹配\
\. 匹配.
\* 匹配*
\[ 匹配[
\] 匹配]
\{ 匹配{
\} 匹配}
\| 匹配|

匹配重复次数

符号 含义
* 零次或者多次
+ 一次或者多次
? 零次或者一次
{n} n次

最大匹配与最小匹配问题

重复匹配时默认按最大长度匹配。 有时候我们想要的是最短长度匹配。此时可以使用?符号进行限定。

符号 含义
*? 零次或者多次,并使用最短匹配
+? 一次或者多次,并使用最短匹配
?? 零次或者一次,并使用最短匹配

指定字符范围

符号 含义
[ax3.?] 匹配括号中字符的任意一个
[a-z] 匹配小写字母
[A-F] 匹配大写字母的A到F
[0-4] 匹配0到4

3.3 开始、结束与换行

开始与结束

符号 含义
^ 匹配文本的开始
$ 匹配文本的结束

根据使用场景的不同,产生的效果也不同。

比如在文本编辑器中查找时,^将代表每一行的开头。 在其他地方使用时,^可能表示文本整体的开头。

匹配包含换行符在内的任意字符

  • [\w\W\n]
  • [\s\S\n]
  • [\d\D\n]

也就是利用匹配和反向匹配。

这在处理多行文本的时候会用的上。