版权声明:可以任意转载,但转载时必须标明原作者charlee、原始链接http://tech.idv2.com/2008/07/08/vim-regexp/以及本声明。
毋庸多言,在vim中正则表达式得到了十分广泛的应用。最常用的 / 和 :s 命令中,正则表达式都是不可或缺的。下面对vim中的正则表达式的一些难点进行说明。
关于magic
vim中有个magic的设定。设定方法为:
:set magic " 设置magic
:set nomagic " 取消magic
:h magic " 查看帮助
vim毕竟是个编辑器,正则表达式中包含的大量元字符如果原封不动地引用(像perl那样),势必会给不懂正则表达式的人造成麻烦,比如 /foo(1) 命令,大多数人都用它来查找foo(1)这个字符串,但如果按照正则表达式来解释,被查找的对象就成了 foo1 了。
于是,vim就规定,正则表达式的元字符必须用反斜杠进行转义才行,如上面的例子,如果确实要用正则表达式,就应当写成 /foo\(1\) 。但是,像 . * 这种极其常用的元字符,都加上反斜杠就太麻烦了。而且,众口难调,有些人喜欢用正则表达式,有些人不喜欢用……
为了解决这个问题,vim设置了 magic 这个东西。简单地说, magic就是设置哪些元字符要加反斜杠哪些不用加的。简单来说:
* 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的设置,在有特殊需要时,直接通过 \v\m\M\V 即可。
本文下面使用的元字符都是 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 意义
\@= (?= 顺序环视
\@! (?! 顺序否定环视
\@<= (?<= 逆序环视
\@<! (?<! 逆序否定环视
\@> (?> 固化分组
\%(atom\) (?: 非捕获型括号
和perl稍有不同的是,vim中的环视和固化分组的模式的位置与perl不同。例如,查找紧跟在 foo 之后的 bar,perl将模式写在环视的括号内,而vim将模式写在环视的元字符之前。
# Perl的写法
/(?<=foo)bar/
# vim的写法
/\(foo\)\@<=bar
参考
vim的帮助文件非常有用,关于正则表达式可以参考以下的内容。
:h pattern
:h magic
:h perl-patterns
分享到:
相关推荐
在labview中使用正则匹配模式很简单,难的就是使用正则表达式。很多人都搞不明白,查了很多资料还是不太明白。实际上就是一些类似通配符在作怪和其他语言也差不多。附件带上了,可以研究研究,构造正则表达式的方法...
正则表达式在多种平台上都有应用,包括 Unix 平台下的程序,如 xsh、egrep、sed、vi 等。它们可以被很多语言采纳,如 HTML 和 XML,这些采纳通常只是整个标准的一个子集。 正则表达式的语法看起来很相似,这是因为...
- **注释和模式变换**:某些语言支持在正则表达式中加入注释,或者改变匹配行为(如忽略大小写)。 - **分组、捕获、条件和控制**:通过圆括号`()`来分组子表达式,可以进行条件匹配或控制匹配行为。 - **Unicode...
书中提供了不同难度级别的正则表达式示例,帮助读者逐步掌握正则表达式的使用技巧。 **1. 简单示例** - **基本匹配**: `testing`,这个简单的表达式能够匹配包含“testing”的字符串,例如“testing”、“123...
定位符在正则表达式中用于指定模式的位置,`^`表示匹配开头,`$`表示匹配结尾,`\b`匹配边界,`\B`匹配非边界。这些定位符使得正则表达式能更精确地定位特定的字符串段落,例如`/^foo/`只匹配以"foo"开头的字符串。 ...
`, `{}`, `[]`, `\`, `^`, `$`, `|`, `(`, `)`等,它们在正则表达式中具有特殊的含义。 - **量词**:`*`表示零或多个,`+`表示一个或多个,`?`表示零个或一个,`{n}`表示精确匹配n个,`{n,}`表示至少n个,`{n,m}`...
在正则表达式中,字符类是一个重要组成部分,它允许用户定义一个字符集合,并将这个集合用在模式匹配中。例如,在许多支持正则表达式的工具中,"[abc]"表示匹配字符'a'、'b'或'c'中的任意一个字符。这种字符类的使用...
在正则表达式中,有几种关键的操作符用于字符匹配: 1. `.`:匹配任意单个字符。例如,`grep .ord sample.txt` 可以在文件中匹配包含"ord"的任何单词。 2. `[ ]`:匹配方括号内的任意一个字符。例如,`grep [cng]...
JAVA 正则表达式是 Java 语言中的一种模式匹配技术,用于字符串模式匹配和字符串模式替换。Java 1.40 版本引入了 java.util.regex 包,提供了对正则表达式的支持。 1. 正则表达式的引擎:正则表达式的引擎已经被...
由于其强大的功能,正则表达式广泛应用于各种编程语言和系统工具中,如Unix/Linux系统下的`vi`编辑器、Perl和PHP脚本语言、以及`awk`或`seds`hell程序等。除此之外,现代Web开发中使用的JavaScript等客户端脚本语言...
正则表达式是一种强大的字符串处理工具,在 Linux 下的 sed、awk、grep 或 vi 等实用工具中得到了广泛应用。作为 C 语言程序员,用户可以在自己的程序中运用正则表达式,以简化处理字符串时的复杂度。 1. 编译正则...
正则表达式是一种强大的字符串处理工具,在 Linux 中广泛应用于 sed、awk、grep、vi 等实用工具中。作为 C 语言程序员,如果熟悉 Linux 下的 sed、awk、grep 或 vi,那么对正则表达式这一概念肯定不会陌生。 在 C ...
你可以查看“正则表达式在各种工具中的使用”来了解不同工具中正则表达式的应用实例。 对于vi的替换命令及其语法的简短解释,将在本文档的末尾提供。 正则表达式基础 正则表达式由普通字符和元字符组成。普通字符...