vsCode中的正则表达式
文章目录
- vsCode中的正则表达式
- 1\. 语法规则
- 1.1. 普通字符
- 1.2. 非打印字符
- 1.3. 特殊字符
- 1.4. 数量词(限定符)
- 1.5. 定位符
- 1.6. 替换构造
- 1.7. 替代
- 1.8. 反向引用
- 1.9. Lookaround
- 1.10. 贪婪匹配
- 2\. 常用收集
- 3\. 解析Markdown语法
vsCode中的正则表达式
vscode上的正则表达式好像和我python写的正则表达式有点区别,导致我写的时候每次都是匹配不上。下面列举了vscode中常见的正则表达式语法规则,以及一些比较常用的场景,供大家查询。现在人工智能这么强大,如果想要寻求正则表达式的定义或者是写正则表达式来匹配一些文字,去找deepseek寻求答案也不乏是一个好办法。但随着人工智能的发展,技术变得愈来愈不重要,试想一下,未来开发一款产品,技术不再是我们关注的重点,也不再是我们的难点,这个世界,这个社会会变得怎么样呢?
在开始将vscode的正则表达式之前,我想在这里撩撩骚,如果觉得无趣的话可以跳过看正文。首先人工智能发展,工程师一定会被淘汰吗?显然,但是只是淘汰大部分,并不是完全替代。这部分没被代替的也不是产品经理,也不是架构师,而就是工程师,这部分工程师包括少量能力出众对于各方各面都有自己认识的高阶工程师,另外一部分就是全民工程师。所谓全民工程师,当然就是字面意思,每个人都可以去当工程师。技术是会随着时间发展的,人工智能也是需要学习的,是需要与时俱进的,这部分学习的资料就可以从这部分高阶工程师中学习。人工智能学习到了这些技能,光学没用,得有人用啊。这样占大头的所谓全民工程师就不断地借助ai来解决自己在开发上的需求,同时也给ai模型进行潜在的微调和矫正。我这里只是讲了未来发展关于开发者群体的态势,并没有讲到技术的细节被逐渐淡出大众视野所带来的社会效应。当然这是很难想象的,因为谁也不清楚未来会发生什么事情,会往什么方向发展。我们能做的只有是尽可能的预测未来的各个领域的格局,让自己在这一波ai浪潮下独善其身。作为一个平凡普通的个体,想要在这个竞争如此激烈的社会下逆风翻盘,必须得像一位专业投资者一样,去预想社会该怎么发展,经济会怎么受到影响,各行各业会不会被重新洗牌。
下面谈谈我的看法,首先人工智能的基础是算力,没算力再优秀的算法也没用,算力意味着资源。目前deepseek一问就卡,除了是因为对岸霉国的ddos攻击,另外一个原因应该是使用用户太多导致的。而且我们大陆人口基数这么多,想要让每个人都能够不卡顿的使用,那么需要的算力,也就是资源是庞大的。也许你会问,你这是偷换概念了呀,deepseek也没必要做到每个人都能够使用的程度。诚然,但你尝试把deepseek当成是一款产品,而一款产品有什么理由不卖给天下人呢?而且,人工智能表面上是效率工具,其实它也是21世纪以来自短视频后的另一奶头乐。人才知道人需要什么,现在人把这些东西教给了人工智能,人工智能就知道我们要什么。到了后面,虽然人人都有了人工智能用于创造的能力,但是大多数人应该还是享受人工智能带来的福利。所以我想说啥?未来贫富差距可能会拉大,资本敛财,或者某某的统治应该会更加有力。通过获取人们的数据,通过模型定位到不利于社会的异端,排除可能会对xx统治造成影响的风险。当然,如果往宏观的角度上来说,那么就是这样。但是,就算是对着宏观角度,也有很多个方向可以去研究,我这里的分析只是冰山一角。类似的去想想,既然xx要大力推广人工智能,那么算力哪来,资源哪来?人工智能赋予了每个人创造的能力,那么这部分资源也哪来?现在各国的人工智能霸权争夺大战,后面也许就会演变成资源大战。当然资源大战从很早就开始了,现在抢石油,未来抢什么?指不定就造个戴森球了!所以,人工智能这一新技术的出现,对于一个文明的科技进步来说应该是有帮助的。但是细化到个人,想要很好地借助它的帮助,那就要见仁见智了。好了码字累了,反正也没人看,就当是自己仰天长啸罢了。
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. 贪婪匹配
*
和+
限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?
就可以实现非贪婪或最小匹配。
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]+\\.(.*)
内容来源:
- 正则表达式 – 教程 | 菜鸟教程
- .NET 正则表达式 | Microsoft Docs
- 正则表达式语言 - 快速参考 | Microsoft Docs
- 正则表达式对象模型 | Microsoft Docs
- 正则表达式行为 | Microsoft Docs
- 正则表达解析 Markdown 语法-黄继鹏博客 (huanghanlian.com)