常用 regex 方言总结

主要考虑的 regex 方言:

控制流

含义 vim sed grep python rg
中缀选择 \| \| \| | |
重复 >= 0 次 * * * * *
重复 >= 1 次 \+ \+ \+ + +
nongreedy, 重复 >= 0 次 \{-} \/ *? *?
0 或 1 次 \? \? \? ? ?
重复 10 次 \{10} \{10} \{10\} {10} {10}

特殊字符

含义 vim sed grep python rg
任意字符 (不含换行) . . . .
任意字符 (含换行) \_. . 使用 re.M 使用 s flag 如 (?s:.)
行/输入的开头 ^ ^ ^ ^ ^
行/输入的末尾 $ $ $ $ $
分组 \(REGEX\) \(REGEX\) \(REGEX\) (REGEX) (REGEX)
后引用 \n, 且 n >= 1 \n \n \n
词开始 \< \< \<
词结束 \> \> \>
词开始或结束 \b \b \b \b

字符类

含义 vim sed grep python rg
数字 \d [[:digit:]] [[:digit:]] \d \d
字母和数字, 以及下划线 \w \w \w \w \w
空白 (不含换行) \s \s \s \s \s
非空白 \S \S \S \S \S
abcd 字符之一 [abcd] [abcd] [abcd] [abcd] [abcd]
任一非 abcd 字符 [^abcd] [^abcd] [^abcd] [^abcd] [^abcd]
0 到 6 [0-6] [0-6] [0-6] [0-6] [0-6]

如果一个字符原原本本地作为了特殊字符, 那么需要反斜杠转义表示它自己.

vim 的 verymagic, magic 和 nomagic, grep 的 -E 和 -G

vim 加上 very magic 后 (通过在模式中加入 \v) 后, 以下操作不用反斜杠 escape

grep 加上 -E 之后, 以下操作不用反斜杠 escape

python 的 re 用法

p = re.compile(r'(\w\w)\.\.\.\1')
t = 'aa...aa**bb...bb'