初学正则表达式
正则表达式?
正则表达式是一种被用于从文本中检索符合某些特定模式的文本, 英文为 "Regular Expression", 缩写 "regex" 或者 "regexp".
- 正则表达式可以很简单的实现比较复杂的字符串匹配逻辑, 来快速地对用户输入施加限制条件. 
- 在日常的文本编辑中, 正则表达式还可以快速的实现复杂的替换操作, 使得文本编辑省时省力. 
- 正则表达式依赖于所处的环境, JavaScript, C#, Java, C++ 等不同的开发语言中以及 VSCode 等不同的文本编辑器下, 正则表达式的匹配规则会有一些细微的差别. 
- 元字符不能写在字符集合 - [ ]的里面.- [ ]中的元字符全部会变为普通字符.
普通元字符
| 元字符 | 描述 | 
|---|---|
| . | 表示一个除换行符以外的任意字符 | 
| () | 字符组, 占位长度和字符串长度一致, 匹配其中的字符串或者逻辑 | 
| [ ] | 字符集合, 默认占位长度为 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 | using System.Text.RegularExpressions; | 
- 匹配第一项
| 1 | using System.Text.RegularExpressions; |