根据对于特殊元字符的不同解释方式,Vim正则表达式可以分为四种模式:magic,no magic,very magic和very nomagic。
- magic模式,使用
\m
前缀,其后模式的解释方式为'magic'选项。^
,$
,.
,*
和[]
等字符含有特殊意义;而+
、?
、()
、和{}
等其它字符则按字面意义解释。magic为默认设置,表达式中的\m前缀可以省略; - no magic模式,使用
\M
前缀,其后模式的解释方式为'nomagic'选项。除了^
和$
之外的特殊字符,都将被视为普通文本; - very magic模式,使用
\v
前缀,其后模式中除 '0'-'9','a'-'z','A'-'Z' 和 '_' 之外的字符都当作特殊字符解释; - very nomagic模式,使用
\V
前缀,其后模式中只有反斜杠(\
)具有特殊意义。
不同模式之间的区别,在于哪些特殊字符需要使用反斜杠(\
)进行转义。例如星号(*),在magic和very magic模式下视为特殊修饰符;而在no magic和very nomagic模式下则被视为普通字符,必须使用“\*”恢复其特殊作用。
对于简单的正则表达式,使用“\”对特殊字符进行转义,可能并不会造成困扰;但在复杂的正则表达式中,对大量特殊字符的重复转义,将使得表达式过于繁琐且难以阅读。
例如在默认的magic模式下,使用以下命令查找十六进制色彩值。其中,使用()
构建捕获组;使用{}
匹配6位和3位十六进制值。因为有多种特殊字符需要进行转义,造成表达式过于冗长:
/\m#\(\x\{6\}\|\x\{3\}\)
而使用very magic模式,则可以简化表达式:
/\v#(\x{6}|\x{3})
4种Magic模式的差异和用法,可以简单总结如下:
模式 | 前缀 | 特殊字符 | 示例 | 适用场景 | |||||
---|---|---|---|---|---|---|---|---|---|
magic | \m | ^ | $ | . | * | [] | 匹配每行中的任意内容 | /^.*$ | 默认模式 |
nomagic | \M | ^ | $ | /\M^\.\*$ | 查找字符串中包含特殊字符 | ||||
very magic | \v | 除'0-9','a-z','A-Z','_'之外 | 匹配十六进制色彩值 | /\v#(\x{6}|\x{3}) | 使用较多特殊字符的复杂正则表达式 | ||||
very nomagic | \V | \ | 匹配正则表达式本身 | /\V^.*$ | 进行精确的完整匹配 查找字符串中包含特殊字符 |
以下表格,列示了常用特殊字符在不同模式下的应用。其中,黄色高亮表示为特殊字符,而不需要转义:
very magic | magic | nomagic | very nomagic | 用途 |
---|---|---|---|---|
\v | \m | \M | \V | |
^ | ^ | ^ | \^ | 匹配行首 |
$ | $ | $ | \$ | 匹配行尾 |
. | . | \. | \. | 匹配任何字符 |
* | * | \* | \* | 匹配任意次数 |
~ | ~ | \~ | \~ | 最近替代字符串 |
[] | [] | \[] | \[] | 匹配列表范围内的字符 |
{} | \{\} | \{\} | \{\} | 匹配重复次数 |
() | \(\) | \(\) | \(\) | 匹配组 |
<> | \<\> | \<\> | \<\> | 匹配词首与词尾 |
+ | \+ | \+ | \+ | 匹配一次或多次 |
? | \? | \? | \? | 匹配零次或一次 |
| | \| | \| | \| | 可选分支 |
\a | \a | \a | \a | 字母字符 其它特殊字符元素 |
\\ | \\ | \\ | \\ | 反斜杠 (字面意义) |
magic默认模式
建议始终将'magic'选项保持在缺省值。
建议在模式之前,通过使用“\v“或“\M“等前缀,来明确激活特定模式。
如果希望始终使用Very magic模式,那么请在vimrc中定义以下键盘映射,将在查找和替换时自动激活very magic模式:
nnoremap / /\v
vnoremap / /\v
cnoremap %s/ %s/\v
nnoremap :g/ :g/\v
模式转换
你甚至可以在表达式当中改变模式。例如以下命令,开头使用very magic模式,之后转换为magic模式,整体表达式将匹配“foo(bar)”:
/\vfoo\(\mbar)
当然,非常不建议采用此种易引起误解的表达式写法。我们可以将其改写为very nomagic模式:
/\Vfoo(bar)
请使用以下命令,查看更多帮助信息:
:help /magic
没有评论:
发表评论