一生醉生忘死,就让他继续下去吧!
分类: LINUX
2012-02-03 09:35:38
magic(m):除了 $ . * ^ 之外其他元字符都要加反斜杠。
nomagic(M):除了 $ ^ 之外其他元字符都要加反斜杠。
这个设置也可以在正则表达式中通过 m M 开关临时切换。 m 后面的正则表达式会按照 magic 处理,M 后面的正则表达式按照 nomagic 处理,而忽略实际的magic设置。
例如:
/m.* # 查找任意字符串 /M.* # 查找字符串 .* (点号后面跟个星号)另外还有更强大的 v 和 V。
v(即 very magic 之意):任何元字符都不用加反斜杠
V(即 very nomagic 之意):任何元字符都必须加反斜杠
例如:
/v(a.c){3}$ # 查找行尾的abcaccadc /m(a.c){3}$ # 查找行尾的(abc){3} /M(a.c){3}$ # 查找行尾的(a.c){3} /V(a.c){3}$ # 查找任意位置的(a.c){3}$默认设置是 magic,vim也推荐大家都使用magic的设置,在有特殊需要时,直接通过 vmMV 即可。
本文下面使用的元字符都是 magic 模式下的。
量词vim的量词与perl相比一点也不逊色。
vim | Perl | 意义 |
* | * | 0个或多个(匹配优先) |
+ | + | 1个或多个(匹配优先) |
? 或 = | ? | 0个或1个(匹配优先),?不能在 ? 命令(逆向查找)中使用 |
{n,m} | {n,m} | n个到m个(匹配优先) |
{n,} | {n,} | 最少n个(匹配优先) |
{,m} | {,m} | 最多m个(匹配优先) |
{n} | {n} | 恰好n个 |
{-n,m} | {n,m}? | n个到m个(忽略优先) |
{-} | *? | 0个或多个(忽略优先) |
{-1,} | +? | 1个或多个(忽略优先) |
{-,1} | ?? | 0个或1个(忽略优先) |
从上表中可见,vim的忽略优先量词不像perl的 *? +? ?? 那样,而是统一使用 {- 实现的。这大概跟忽略优先量词不常用有关吧。
环视和固化分组vim居然还支持环视和固化分组的功能,强大,赞一个。关于环视的解释请参考Yurii的一书吧。
vim | Perl | 意义 |
@= | (?= | 顺序环视 ====>查找word后面是,word(?=abc) |
@! | (?! | 顺序否定环视 ====>查找word后面不是,word(?!abc) |
@<= | (?<= | 逆序环视 ====>查找word前面是,(?<=abc)word |
@ | (? | 逆序否定环视 ====>查找word前面不是,(? |
@> | (?> | 固化分组 ====> |
\%(atom) | (?: | 非捕获型括号 ====> |
和perl稍有不同的是,vim中的环视和固化分组的模式的位置与perl不同。例如,查找紧跟在 foo 之后的 bar,perl将模式写在环视的括号内,而vim将模式写在环视的元字符之前。
# Perl的写法 /(?<=foo)bar/
# vim的写法 /(foo)@<=bar 参考
vim的帮助文件非常有用,关于正则表达式可以参考以下的内容。
:h pattern :h magic :h perl-patterns