通配符与正则表达式
通配符与正则表达式
更新日期: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]
也就是利用匹配和反向匹配。
这在处理多行文本的时候会用的上。