初学正则表达式

正则表达式?

正则表达式是一种被用于从文本中检索符合某些特定模式的文本, 英文为 "Regular Expression", 缩写 "regex" 或者 "regexp".

  1. 正则表达式可以很简单的实现比较复杂的字符串匹配逻辑, 来快速地对用户输入施加限制条件.

  2. 在日常的文本编辑中, 正则表达式还可以快速的实现复杂的替换操作, 使得文本编辑省时省力.

  3. 正则表达式依赖于所处的环境, JavaScript, C#, Java, C++ 等不同的开发语言中以及 VSCode 等不同的文本编辑器下, 正则表达式的匹配规则会有一些细微的差别.

  4. 元字符不能写在字符集合 [ ] 的里面. [ ] 中的元字符全部会变为普通字符.

普通元字符

元字符 描述
. 表示一个除换行符以外的任意字符
() 字符组, 占位长度和字符串长度一致, 匹配其中的字符串或者逻辑
[ ] 字符集合, 默认占位长度为 1, 匹配集合中的任意一个字符, 可以使用范围符 - 来表示范围, 如: 0-9, a-z, A-Z 等
[^ ] 否定字符集合, 默认占位长度为 1, 匹配集合中的所有字符以外的任意一个字符
| 逻辑或
\ 转义符

字符集

[注意] 字符集名称(大小写敏感), \w 和 \W 的含义完全相反.

转义符 描述
\f 匹配一个换页符
\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个制表符
\v 匹配一个垂直制表符
\w 匹配所有字母和数字的字符, 某些环境下也会匹配汉字
\W 匹配非字母和数字的字符, 某些环境下汉字也会排除
\d 匹配数字: [0-9]
\D 匹配非数字: [^ 0-9]
\s 匹配任何空白字符, 包括空格, 制表符, 换页符等
\S 匹配非空格符

次数限定符

写在一个特定的字符或者字符组 () 的后面, 控制字符或者字符组的出现次数.

次数限定符 描述
* 匹配前面的子表达式 0 次或多次
+ 匹配前面的子表达式 1 次或多次
? 匹配前面的子表达式 0 次或 1 次, 或指明一个非贪婪限定符
{n} 花括号, 匹配前面字符或字符组 n 次
{n,} 花括号, 匹配前面字符或字符组至少 n 次
{n,m} 花括号, 匹配前面字符或字符组至少 n 次, 但是不超过 m 次

定位符

定位符表示字符所处的位置.

定位符 描述
^ 表示行的开始
$ 表示行的结束
\b 匹配一个单词边界
\B 非单词边界匹配

前后缀逻辑 (断言)

Q1: 匹配字符串中以全角美元符开头的 '12000.00'

12000.00 ¥12000.00 $12000.00

Q2: 匹配字符串中以全角美元符结尾的 '12000.00'

12000.00 12000.00¥ 12000.00$

上面的两个问题, 就可以通过在正则表达式中添加前后缀逻辑来解决. '前后缀逻辑' 是我自己起的名字, 方便自己记忆, 但是有的文章中叫作 "断言", 有的文章中叫 "预匹配", 我都感觉好别扭啊!

[] 前后缀逻辑必须写在字符组 () 里面, 如: (?<=K).

前后缀逻辑组件

[] 下面是前后缀逻辑实现时用到的字符, 不能直接使用, 这样拆开写只是为了容易理解! 切记不可直接使用!

符号 描述
?< 前缀描述符, 必须写在 "被描述字符或字符组" 的 前面
? 后缀描述符, 必须写在 "被描述字符或字符组" 的 后面
=
! 不是

前缀逻辑 (前行断言)

前行断言

符号 描述
(?<=) 前缀为 描述符
(?<!) 前缀不为 描述符

[] 前缀描述符必须写在 "被描述字符或字符组" 的 前面 ! 切记 !

示例:

(?<=K)[0-9]{11}: 匹配以 'K' 为前缀的 11 位数字.

(?<!K)[0-9]{11}: 匹配不以 'K' 为前缀的 11 位数字.

后缀逻辑 (后行断言)

后行断言

符号 描述
(?=) 后缀为 描述符
(?!) 后缀不为 描述符

[] 后缀描述符必须写在 "被描述字符或字符组" 的 后面 ! 切记 !

示例:

[\d]{11}(?=K): 匹配以 'K' 为后缀的 11 位数字.

[\d]{11}(?!K): 匹配不以 'K' 为后缀的 11 位数字.

答案

A1: (?<=$)[\d.]+ 答案不唯一

A2: [\d.]+(?=$) 答案不唯一

修饰符

会修改正则表达式的匹配模式, 可以以任意顺序或组合使用, 先将要修饰的整个正则表达式前后加一个 / 字符, 然后在后面的 / 字符后面加修饰符.

标记 描述
i 不区分大小写: 将匹配设置为不区分大小写.
g 全局搜索: 搜索整个输入字符串中的所有匹配.
m 多行匹配: 会匹配输入字符串每一行.

示例:

  • /(T|t)he/gi : 全局搜索, 不区分大小写, 正则: (T|t)he

  • /.(at)/g : 全局搜索, 正则: .(at)

  • /at(.)?$/gm :全局搜索, 多行匹配, 正则: at(.)?$

C# 中的正则表达式

  1. 全部匹配
1
2
3
4
5
6
7
8
9
10
11
12
13
using System.Text.RegularExpressions;

string content = "content";
Regex regex = new Regex(@"[0-9]{8}");
MatchCollection matchs = regex.Matches(content);

foreach (Match match in matchs)
{
if (!string.IsNullOrEmpty(match.Value))
{
//TODO...
}
}
  1. 匹配第一项
1
2
3
4
5
6
7
8
9
10
using System.Text.RegularExpressions;

string content = "content";
Regex regex = new Regex(@"[0-9]{8}");
Match match = regex.Match(content);

if (!string.IsNullOrEmpty(match.Value))
{
//TODO...
}