2024 年 3 月 31 日更新:像有序列表和无序列表互换这样比较简单的问题,现在我都用 Vim 处理,不想费脑筋想正则了。


本文记录了我使用过的正则表达式,多数用于处理 Markdown 文档。所有正则表达式均在 VSCode 测试。

选取多段文字

有时候我要选取很多段文字,比如某本书的一个章节。以前我选取多段文字都是这样的:

  1. 把光标定位到开头
  2. 按下 Shift
  3. 滚动文档到结尾
  4. 点击一下结尾

有时候这个招数不太好使,滚动文档的时候也不知道有没有超过了结尾。还是用正则表达式好,不用担心错过了结尾。

以下面的文档作例子,截取第一章的内容:

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. 把文档标题变成一级标题。

以算术笔记为例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
---
title: 算术
---

# 加法

加法是基本算术运算。简单来说,加法将两个数字结合,成为一个数字,称之为“和”。

# 减法

减法是加法的逆运算。减法是求出两个数(被减数和减数)的差。
  1. 内容标题等级 + 1

    搜索 ^#,替换为 $0#,其实也就是给标题加多个 #

  2. 把文档标题变成一级标题

    搜索 ---\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. 删除文档标题
  2. 把一级标题变成文档标题
  3. 内容标题等级 - 1

具体步骤:

  1. 删除文档标题

    搜索 ---\ntitle:.+\n---\n\n,替换为 空字符串

  2. 把一级标题变成文档标题

    搜索 ^# (.+) ,替换为 ---\ntitle: $1\n---

  3. 内容标题 - 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. 葡萄

都会显示为:

水果:

  1. 香蕉
  2. 椰子
  3. 葡萄

把下面的无序列表转换为从 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 中查找内容 - 叶寻 | Cyrus Yip