zxc-cppnb

导航

 

正则表达式

可以把 Vim 的搜索模式想象成一种高级的“找东西”的配方,它比简单的输入文字搜索要强大得多。
在vim中搜索模式包含正则,所以接下来统一说模式{pattern}

模式是什么?

模式是一个或多个由"|"分隔的分支。它能匹配任何符合其中某个分支的内容。

示例:"foo|beep"可匹配"foo"和"beep"。若多个分支同时匹配,则使用最先匹配的分支。

模式 ::= 分支
或 分支 | 分支
或 分支 | 分支 | 分支

模式是由一小块一小块的规则拼接起来的,理解这些小块很重要:

片段 (Piece):最基本的构建块。它规定了一个匹配动作和这个动作要重复多少次。

匹配什么:比如直接匹配字母 a,或者匹配任意数字 [0-9]。

原子:原子可以是多种类型中的一种。许多原子用于匹配文本中的一个字符,通常是普通字符或字符类。括号可用于将模式转换为原子。

量词:比如 a* 表示“匹配 a 零次或多次”(能找到 a, aa, aaa,甚至找不到 a 也行);a+ 表示“匹配 a 一次或多次”(必须至少有一个 a)。

串联 (Concat):把几个“片段”串起来,要求按顺序连续出现。比如 f[0-9]b 就是:先找到一个 f,紧接着找到一个数字,再紧接着找到一个 b。

分支 (Branch):就是上面提到的“或”操作,用 | 连接多个选项。foo|beep 表示找 foo 或者 beep。

量词

* 匹配零次到任意多次
\+ 匹配一次到任意多次
\? 匹配一次或零次
\= 匹配一次或零次(这个用于反向搜索操作?防止语义冲突)
\{n,m} 匹配n到m次,尽可能的多匹配
\{n,} 匹配n到任意多次,尽可能的多匹配
\{,m} 匹配0到m次,尽可能的多匹配
\{} 匹配任意多次和*一样
\{-n,m} 匹配n到m次,尽可能的少匹配
\{-n,} 匹配n到任意多次,尽可能的少匹配
\{-,m} 匹配0到m次,尽可能的少匹配
\{-} 匹配任意多次,尽可能少匹配

例子:
量词用于修饰左边的原子,描述这个原子出现的次数
ba\+ 匹配一个b紧接着1到任意多次的a,例如ba,baa,baaa等
b\{3,5}a\= 匹配3到5个b紧接着0到1个a,例如bbb,bbba,bbbb,bbbba,bbbbb,bbbbba

字符集

字符集用一对方括号把当前位置可能出现的字符描述出来
例如:
[a-z] 匹配一个范围在a到z的字母,也就是所有小写字母
[abc] 仅匹配a,b,c三个字母其中一个
[a-zA-Z] 匹配所有字母无论大小写
[0-9a-z] 匹配数字或者小写字母
[2-9a-fz] 匹配2到9字符或者a到f字符或者z字符
在紧接着[右边写^表示除了,例如:
[^a-z] 除了小写字母

字符集也是一个原子
为了简化操作vim内置了一些字符集的简写:

\s 匹配空格或者制表符
\S 匹配除了空格和制表符
\d 匹配数字,和[0-9]一样
\D 匹配除了数字的字符,和[^0-9]一样
\x 匹配一个16进制字符,和[0-9a-f]一样
\X 匹配除了16进制字符,和[^0-9a-f]一样
\o 匹配8进制字符,和[0-7]一样
\O 匹配除了8进制字符,和[^0-7]一样
\w 匹配单词字符,和[a-zA-Z0-9_]一样
\W 匹配非单词字符,和[^a-zA-Z0-9_]一样
\h 匹配单词开头字符,和[a-zA-Z_]一样
\H 匹配非单词开头字符,和[^a-zA-Z_]一样
\a 匹配一个字母,和[a-zA-Z]一样
\A 匹配一个非字母字符,和[^a-zA-Z]一样
\l 匹配一个小写字母,和[a-z]一样
\L 匹配一个非小写字母,和[^a-z]一样
\u 匹配一个大写字母,和[A-Z]一样
\U 匹配一个非大写字母,和[^A-Z]一样

注意字符集仅仅只是规定匹配字符的范围,而不是出现了多少次(只写字符集表示出现一次)。出现多少次是用量词修饰的
例子:
\h\w\+ 匹配一个标识符
0x\x\+ 匹配一个c语言的16进制数
0\o\+ 匹配一个c语言的8进制数

捕获组

捕获组用一对圆括号把一个子模式描述为一个原子,用于整体修饰量词或者之后引用
例如:
\(foo\)\+ 匹配1到若干个foo,例如foo,foofoo,foofoofoo等
\(b[ba]r\)\+ 匹配1到若干个bar或者bbr,例如bar,bbr,barbbr,bbrbar,barbbrbbr等
\(foo\|bar)\+ 匹配1到若干个foo或者bar,例如foo,bar,foobar,barfoo,foobarfoo,foobarbar等
捕获组还可以后续引用,用\1引用第一个捕获组匹配到的内容,\2引用第二个捕获组匹配到的内容,...,一共到\9
例如:
\(foo\|bar\)\1ar 匹配foofooar或者barbarar,但不能是foobarar或者barfooar

锚点

锚点不是匹配真正的字符,而是匹配位置

^ 匹配行开头
$ 匹配行末尾
< 匹配单词开头
> 匹配单词末尾

例如:
^static\s\+\h\w\+ 匹配行开头是static然后接着任意个空格或者制表符再紧接着一个标识符
\<foo\> 匹配foo单词,和直接写foo有所不同,直接写foo会匹配foobar中的foo,加上单词边界可以严格搜索foo

very magic模式

在模式搜索开头写\v会进入very magic模式,此时你就可以省略很多的反斜杠\
例如捕获组,量词都不需要用\转义了,如果你需要在very magic模式表示普通的括号使用\转义即可

posted on 2025-09-19 17:02  Cpp_Nb  阅读(31)  评论(0)    收藏  举报