基本语法

匹配

  • . 匹配任意单个字符(除了换行符)
  • \d 匹配数字(等价于 [0-9])
  • \w 匹配字母、数字或下划线(等价于 [a-zA-Z0-9_]
  • \s 匹配空白字符(空格、制表符、换行等)
  • ^ 匹配字符串开头
  • $ 匹配字符串结尾
  • * 匹配前一个字符 0 次或多次
  • + 匹配前一个字符 1 次或多次
  • ? 匹配前一个字符 0 次或 1 次
  • {n} 匹配前一个字符恰好 n 次
  • {n,} 匹配前一个字符至少 n 次
  • {n,m} 匹配前一个字符 n 到 m 次
  • [abc] 匹配 a、b 或 c 中的任意一个
  • (abc) 分组,匹配 abc 并捕获

跳过

  • A(?!B):匹配 A,但 A 后面不能是 B,负向零宽先行断言
  • (?<!B)A:匹配 A,但 A 前面不能是 B,负向零宽后行断言
  • [^ABC]:匹配非 A、B、C 的字
  • (?:A|B)\KC:匹配 C,但前面可以是 A 或 B(\K 会丢弃前面的匹配)
  • A(*SKIP)(*FAIL)|B:跳过 A,只匹配 B

替换md表格居中

假设我有一个md表格如下:

| 左对齐标题 | 右对齐标题 | 默认对齐标题 |
| ---------- | ---------: | ------------ |
| 单元格A | 单元格B | 单元格C |
| 单元格D | 单元格E | 单元格F |

我想要把所有的---都换成:---:居中的样式,可以使用如下正则表达式:

(\|)\s*:?(-+):?\s*

替换为:

$1:$2:

学习

  • ()表示分组,与后面的$1$2对应起来,没有分组的在替换的时候就会被丢弃
  • \|:反斜杠转义|
  • \s代表空白字符(空格、制表符、换行等),*代表匹配前一个字符 0 次或多次
  • :??代表匹配前一个字符 0 次或 1 次
  • (-+)+代表匹配前一个字符 1 次或多次

匹配所有空白

我有下面这段文本,我想要把前面的空格替换为-

- . 匹配任意单个字符(除了换行符)
- \d 匹配数字(等价于 [0-9])
\w 匹配字母、数字或下划线(等价于 [a-zA-Z0-9_])
\s 匹配空白字符(空格、制表符、换行等)
^ 匹配字符串开头
$ 匹配字符串结尾
* 匹配前一个字符 0 次或多次
+ 匹配前一个字符 1 次或多次

直接^\s+会匹配到md开头的tag,因此要使用零宽断言来跳过某些样式

Image 2

使用

^(?!\s*-)\s+

学习

  • (?!\s*-)(?!...)负向零宽先行断言,A(?!B) → 匹配 A,但 A 后面不能是 B