正则表达式实例
叶寻
目次
2024 年 3 月 31 日更新:像有序列表和无序列表互换这样比较简单的问题,现在我都用 Vim 处理,不想费脑筋想正则了。
本文记录了我使用过的正则表达式,多数用于处理 Markdown 文档。所有正则表达式均在 VSCode 测试。
选取多段文字 #
有时候我要选取很多段文字,比如某本书的一个章节。以前我选取多段文字都是这样的:
- 把光标定位到开头
- 按下 Shift
- 滚动文档到结尾
- 点击一下结尾
有时候这个招数不太好使,滚动文档的时候也不知道有没有超过了结尾。还是用正则表达式好,不用担心错过了结尾。
以下面的文档作例子,截取第一章的内容:
1
2
3
4
5
6
7
8
9
| # 第一章
假设这里有好长的一段话。
假设这里又有好长的一段话。
# 第二章
又来一段话。
|
也就是:
1
2
3
| 假设这里有好长的一段话。
假设这里又有好长的一段话。
|
表达式:
1
| (?<=# 第一章\n{2})(.|\n)+(?=\n{2}# 第二章)
|
(?<=)
为正后发断言(Positive Lookbehind),匹配它后面的内容。(?<=# 第一章\n{2})
的意思是匹配第一章加两个换行之后的内容。
(?=)
后正先行断言(Positive Lookahead),匹配它前面的内容。(?=\n{2}# 第二章)
的意思就是匹配两个换行加第二章。
我们真正需要的文本包括了文字和换行,所以用 (.|\n)+
来匹配。
合并与拆分文档 #
合并文档 #
假如我有两门课的笔记,需要把它们合并到一块。
把这两份笔记:
1
2
3
4
5
6
7
8
9
10
11
| ---
title: 算术
---
# 加法
加法是基本算术运算。简单来说,加法将两个数字结合,成为一个数字,称之为“和”。
# 减法
减法是加法的逆运算。减法是求出两个数(被减数和减数)的差。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| ---
title: 几何
---
# 点
在欧几里得几何中,点是空间中只有位置,没有大小的图形。
# 线
欧几里得把线形容成“在点之间均匀铺着”的“没有宽度的长度”。
# 面
二维,光滑且无限延展的平层构成了平面。
|
合并为(title: 数学
这一部分需要手动输入):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| ---
title: 数学
---
# 算术
## 加法
加法是基本算术运算。简单来说,加法将两个数字结合,成为一个数字,称之为“和”。
## 减法
减法是加法的逆运算。减法是求出两个数(被减数和减数)的差。
## 点
在欧几里得几何中,点是空间中只有位置,没有大小的图形。
# 几何
## 线
欧几里得把线形容成“在点之间均匀铺着”的“没有宽度的长度”。
## 面
二维,光滑且无限延展的平层构成了平面。
|
解决思路:
- 内容标题等级 + 1
- 把文档标题变成一级标题。
以算术笔记为例:
1
2
3
4
5
6
7
8
9
10
11
| ---
title: 算术
---
# 加法
加法是基本算术运算。简单来说,加法将两个数字结合,成为一个数字,称之为“和”。
# 减法
减法是加法的逆运算。减法是求出两个数(被减数和减数)的差。
|
内容标题等级 + 1
搜索 ^#
,替换为 $0#
,其实也就是给标题加多个 #
把文档标题变成一级标题
搜索 ---\ntitle: (.+)\n---
,替换为 # $1
处理完之后算术笔记就变成这样了:
1
2
3
4
5
6
7
8
9
| # 算术
## 加法
加法是基本算术运算。简单来说,加法将两个数字结合,成为一个数字,称之为“和”。
## 减法
减法是加法的逆运算。减法是求出两个数(被减数和减数)的差。
|
用同样的方法处理几何笔记:
1
2
3
4
5
6
7
8
9
10
11
| # 几何
## 点
在欧几里得几何中,点是空间中只有位置,没有大小的图形。
## 线
欧几里得把线形容成“在点之间均匀铺着”的“没有宽度的长度”。
## 二维,光滑且无限延展的平层构成了平面。
|
最后新建一个文档,手动输入 title: 数学
,再把两份处理好的文档复制进去就可以了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| ---
title: 数学
---
# 算术
## 加法
加法是基本算术运算。简单来说,加法将两个数字结合,成为一个数字,称之为“和”。
## 减法
减法是加法的逆运算。减法是求出两个数(被减数和减数)的差。
## 点
在欧几里得几何中,点是空间中只有位置,没有大小的图形。
# 几何
## 线
欧几里得把线形容成“在点之间均匀铺着”的“没有宽度的长度”。
## 面
二维,光滑且无限延展的平层构成了平面。
|
拆分文档 #
我们用上个教程合并的文档为例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| ---
title: 数学
---
# 算术
## 加法
加法是基本算术运算。简单来说,加法将两个数字结合,成为一个数字,称之为“和”。
## 减法
减法是加法的逆运算。减法是求出两个数(被减数和减数)的差。
## 点
在欧几里得几何中,点是空间中只有位置,没有大小的图形。
# 几何
## 线
欧几里得把线形容成“在点之间均匀铺着”的“没有宽度的长度”。
## 面
二维,光滑且无限延展的平层构成了平面。
|
将其拆分为两份文档:
1
2
3
4
5
6
7
8
9
10
11
| ---
title: 算术
---
# 加法
加法是基本算术运算。简单来说,加法将两个数字结合,成为一个数字,称之为“和”。
# 减法
减法是加法的逆运算。减法是求出两个数(被减数和减数)的差。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| ---
title: 几何
---
# 点
在欧几里得几何中,点是空间中只有位置,没有大小的图形。
# 线
欧几里得把线形容成“在点之间均匀铺着”的“没有宽度的长度”。
# 面
二维,光滑且无限延展的平层构成了平面。
|
解决思路:
- 删除文档标题
- 把一级标题变成文档标题
- 内容标题等级 - 1
具体步骤:
删除文档标题
搜索 ---\ntitle:.+\n---\n\n
,替换为 空字符串
把一级标题变成文档标题
搜索 ^# (.+)
,替换为 ---\ntitle: $1\n---
内容标题 - 1
搜索 ^#
,替换为 空字符串
。
结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| ---
title: 算术
---
# 加法
加法是基本算术运算。简单来说,加法将两个数字结合,成为一个数字,称之为“和”。
# 减法
减法是加法的逆运算。减法是求出两个数(被减数和减数)的差。
# 点
在欧几里得几何中,点是空间中只有位置,没有大小的图形。
---
title: 几何
---
# 线
欧几里得把线形容成“在点之间均匀铺着”的“没有宽度的长度”。
# 面
二维,光滑且无限延展的平层构成了平面。
|
最后把内容复制到两个空文档就可以了。
有序列表与无序列表互换 #
虽然用正则表达式可以转换列表,其实我觉得 Typora 的列表转换功能更方便,点一下按钮就可以了。
有序列表转为无序列表 #
把下面的有序列表转换为无序列表:
1
2
3
4
5
| 水果:
1. 香蕉
2. 椰子
3. 葡萄
|
搜索 \d+\.(?= )
,替换为 -
:
1
2
3
4
5
| 水果:
- 香蕉
- 椰子
- 葡萄
|
无序列表转为有序列表 #
有序列表的数字不需要递增,实际上是从第一个数字开始递增的。
比如下面这几个列表显示效果是一样的:
1
2
3
4
5
| 水果:
11. 香蕉
12. 椰子
13. 葡萄
|
1
2
3
4
5
| 水果:
11. 香蕉
1. 椰子
1. 葡萄
|
1
2
3
4
5
| 水果:
11. 香蕉
11. 椰子
11. 葡萄
|
都会显示为:
水果:
- 香蕉
- 椰子
- 葡萄
把下面的无序列表转换为从 2 数起的有序列表:
1
2
3
4
5
| 水果:
- 香蕉
- 椰子
- 葡萄
|
搜索 -(?= )
,转换为 2.
:
1
2
3
4
5
| 水果:
2. 香蕉
2. 椰子
2. 葡萄
|
删除与增加空行 #
删除多余空行 #
在 Markdown 中使用多个空行不会增加段落间的空白,下面两份文档显示效果是一样的:
1
2
3
4
5
6
7
| # 加法
加法是基本算术运算。
# 减法
减法是加法的逆运算。
|
1
2
3
4
5
6
7
8
9
10
11
| # 加法
加法是基本算术运算。
# 减法
减法是加法的逆运算。
|
因此,可以删去多余的空行。以上面的文档为例,演示删除多余的空行。
搜索 \n{2,}
,替换为 \n\n
。
增加空行 #
有些纯文本文档用一个换行符来分段,增加空行可以快速将其转换为 Markdown 文档。以下面的文档为例子:
1
2
3
4
| 加法
加法是基本算术运算。
减法
减法是加法的逆运算。
|
搜索 \n
,替换为 \n\n
:
1
2
3
4
5
6
7
| 加法
加法是基本算术运算。
减法
减法是加法的逆运算。
|
删除知网导出文献的编号 #
一般写论文都是用 Word 自动编号的,知网文献的编号没什么用,所以就先把编号删掉。
1
2
| [1]黄城烟.参考文献中标准著录格式的新规定及其影响——以GB/T7714―2015为例[J].中国科技期刊研究,2016,27(03):243-248.
[2]韩云波,蒋登科.参考文献国家标准GB/T7714—2015的修订特色与细则商榷[J].西南大学学报(社会科学版),2015,41(06):157-167.
|
在 LibreOffice Writer 按下 Ctrl H
,搜索 \[\d+\]
,替换为空字符串
。在 MS Word 里面应该搜索 \[[0-9]@\]
。替换后之后文献前的数字就没有了:
1
2
| 黄城烟.参考文献中标准著录格式的新规定及其影响——以GB/T7714―2015为例[J].中国科技期刊研究,2016,27(03):243-248.
韩云波,蒋登科.参考文献国家标准GB/T7714—2015的修订特色与细则商榷[J].西南大学学报(社会科学版),2015,41(06):157-167.
|
在扫描版 PDF 中查找内容 #
在扫描版 PDF 中查找内容
giscus 评论。如果评论未加载,giscus 可能被你的互联网服务提供商屏蔽。
Disqus 评论。如果评论未加载,Disqus 可能被你的互联网服务提供商屏蔽。