【使用手册】之–vsCode中的正则表达式
#教程 #系统 #工具 #手册
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等,可以极大的提高处理字符串的效率,这里以vsCode
为例,也可以使用EditePlus
、Notepad++
等。
1. 语法规则
构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
1.1. 普通字符
字符 | 描述 |
---|---|
[ABC] |
匹配 [...] 中的所有字符,例如 [ab] 匹配字符串 “abc xacb” 中所有的a b字母。 |
[^ABC] |
匹配除了 [...] 中字符的所有字符。 |
[A-Z] |
[A-Z] 表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字母。 |
. |
匹配除换行符(\n、\r)之外的任何单个字符,相等于 [^\n\r] 。 |
[\s\S] |
匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行。 |
\w |
匹配字母、数字、下划线。等价于 [A-Za-z0-9_] |
[\u4e00-\u9fa5] |
匹配汉字,也可使用[^\x00-\xff] |
1.2. 非打印字符
非打印字符也可以是正则表达式的组成部分。下表列出了表示非打印字符的转义序列:
字符 | 描述 |
---|---|
\cx |
匹配X或x指定的ASCII控制字符。例如,\cM 匹配一个 Control-M 或回车符。 |
\f |
匹配一个换页符。等价于 \x0c 和 \cL。 |
\n |
匹配一个换行符。等价于 \x0a 和 \cJ。 |
\r |
匹配一个回车符。等价于 \x0d 和 \cM。 |
\s |
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 注意 Unicode 正则表达式会匹配全角空格符。 |
\S |
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
\t |
匹配一个制表符。等价于 \x09 和 \cI。 |
\v |
匹配一个垂直制表符。等价于 \x0b 和 \cK。 |
1.3. 特殊字符
具有特殊含义的字符。若要匹配这些需要"转义",在特殊字符前添加反斜杠\
。
特别字符 | 描述 |
---|---|
$ |
匹配输入字符串的结尾位置。 |
( ) |
标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。 |
* |
匹配前面的子表达式零次或多次。 |
+ |
匹配前面的子表达式一次或多次。 |
. |
匹配除换行符 \n 之外的任何单字符。 |
[ |
标记一个中括号表达式的开始。 |
? |
匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。 |
\ |
将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。 |
^ |
匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。 |
{ |
标记限定符表达式的开始。 |
| | 指明两项之间的一个选择。 |
1.4. 数量词(限定符)
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
字符 | 描述 |
---|---|
* |
匹配前面的子表达式零次或多次。等价于 {0,}。 |
+ |
匹配前面的子表达式一次或多次。等价于 {1,}。 |
? |
匹配前面的子表达式零次或一次。等价于 {0,1}。 |
{n} |
n是一个非负整数。匹配确定的 n次。 |
{n,} |
n是一个非负整数。至少匹配n次。 |
{n,m} |
m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。 |
1.5. 定位符
定位符使您能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。
字符 | 描述 |
---|---|
^ | 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。 |
$ | 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。 |
\b | 匹配一个单词边界,即字与空格间的位置。 |
\B | 非单词边界匹配。 |
注意:不能将限定符与定位符一起使用。由于在紧靠换行或者单词边界的前面或后面不能有一个以上位置,因此不允许诸如 ^*
之类的表达式。
若要匹配一行文本开始处的文本,请在正则表达式的开始使用^
字符。不要将^
的这种用法与中括号表达式内的用法混淆。
若要匹配一行文本的结束处的文本,请在正则表达式的结束处使用$
字符。
若要在搜索章节标题时使用定位点,下面的正则表达式匹配一个章节标题,该标题只包含两个尾随数字,并且出现在行首:
1.6. 替换构造
替换构造用于修改正则表达式以启用 either/or 匹配。
替换构造 | 描述 |
---|---|
| | 匹配以竖线(|字符分隔的任何一个元素。 |
(?( expression)yes | no) 或(?( expression)yes) |
如果由expression指定的正则表达式模式匹配,则匹配yes;否则,匹配可的no部分。expression解释为零宽度的断言。 为了避免已命名或已编号的捕获组出现歧义,可选择使用显式断言,如下所示:(?( (?= expression) )yes | no) |
1.7. 替代
用圆括号()
将所有选择项括起来,相邻的选择项之间用|
分隔。()
表示捕获分组,()
会把每个分组里的匹配的值保存起来, 多个匹配值可以通过数字n来查看(n是一个数字,表示第n个捕获组的内容)。
字符 | 描述 |
---|---|
$n |
替换按组n匹配的子字符串。 |
${name} |
替换按命名组name匹配的子字符串。 |
替换前
替换后
1.8. 反向引用
反向引用允许在同一正则表达式中随后标识以前匹配的子表达式。
反向引用 | 描述 |
---|---|
\n |
后向引用。 匹配编号子表达式的值。 |
\k<name> |
命名后向引用。 匹配命名表达式的值。 |
替换重复的字符串,也可使用命名引用(?<汉字>[\u4e00-\u9fa5]+)\k<汉字>
。
1.9. Lookaround
当要查找的字符串在特定字符串之前或之后,可以使用Lookaround 表达式。
Lookaround | 名称 | 函数 |
---|---|---|
exp1(?=exp2) |
正预测先行 | 查找 exp2 前面的 exp1。 |
(?<=exp2)exp1 |
正预测后行 | 查找 exp2 后面的 exp1。 |
exp1(?!exp2) |
负预测先行 | 查找后面不是 exp2 的 exp1。 |
(?<!exp2)exp1 |
负预测后行 | 查找前面不是 exp2 的 exp1。 |
1.10. 贪婪匹配
*
和+
限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?
就可以实现非贪婪或最小匹配。
贪婪
非贪婪
1.11. 一些例子
匹配一些字符
匹配汉字
替换多余的换行符
匹配n个字符
复杂点的实际应用
2. 常用收集
# Email地址
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
# 域名
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
# URL
[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
# IP地址
((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))
# 手机号码
^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
# 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX)
^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
# 国内电话号码(0511-4405222、021-87888822)
\d{3}-\d{8}|\d{4}-\d{7}
# 身份证号(15位、18位数字)
^\d{15}|\d{18}$
# 短身份证号码(数字、字母x结尾)
^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
# 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线)
^[a-zA-Z][a-zA-Z0-9_]{4,15}$
# 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线)
^[a-zA-Z]\w{5,17}$
# 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间)
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
# 日期格式
^\d{4}-\d{1,2}-\d{1,2}
# 一年的12个月(01~09和1~12)
^(0?[1-9]|1[0-2])$
# 一个月的31天(01~09和1~31)
^((0?[1-9])|((1|2)[0-9])|30|31)$
# xml文件
^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
# 中文字符的正则表达式
[\u4e00-\u9fa5]
# 双字节字符
[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
# 空白行的正则表达式
\n\s*\r (可以用来删除空白行)
# HTML标记的正则表达式
<(\S*?)[^>]*>.*?</\1>|<.*? /> (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)
# 首尾空白字符的正则表达式
^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
# 腾讯QQ号
[1-9][0-9]{4,} (腾讯QQ号从10000开始)
# 中国邮政编码
[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
3. 解析Markdown语法
Markdown 语法包括标题、图片、链接、引用块、列表、粗体、斜体等,下面是解析这些语法的正则表达式和简单说明:
- 标题(表示以一个或多个“#”开头的字符串,并且“#”之后有0个或以上的字符,如:“### 三级标题”)。
^(#+)(.*)复制代码
- 链接 (在 Markdown 语法中链接的表示形式为
[链接](URL)
。)。
/\[[\s\S]*?\]\([\s\S]*?\)/g
解释: 匹配 [
符 开始 紧接着[\s\S]范围类 空白符或者非空白符都可以的类。 *
代表出现0次或者无限次 ?
非贪婪模式 让正则表达式尽可能少的匹配,也就是说一旦匹配成功匹配不再继续尝试,就是非贪婪模式。 做法很简单,在量词后面加上?即可。
- 斜体(表示以一个 * 或者 _ 开头并结尾(\1表示规则和第一个集合相同),中间包含0个或多个字符的字符串)。
(\\*|_)(.*?)\\1
- 图片(部分地方同链接)
!\\[[^\\]]+\\]\\([^\\)]+\\)
- 粗体(同斜体)
(\\*\\*|__)(.*?)\\1
- 删除线(删除线)
\\~\\~(.*?)\\~\\~
- 引用块
\n(>|\\>)(.*)
- 内联代码块
`{1,2}[^`](.*?)`{1,2}
- 分割线
^-+$
- *```*包围的代码块
```([\\s\\S]*?)```[\\s]?
- 无序列表
^[\\s]*[-\\*\\+] +(.*)
- 有序列表
^[\\s]*[0-9]+\\.(.*)
内容来源:
评论区