正则
一 VI中如何使用正则表达式
使用正则表达式的命令最常见的就是/ (搜索)命令。其格式如下:
/正则表达式
另一个很有用的命令就是 :s(替换)命令,将第一个//之间的正则表达式替换成第二个//之间的字符串。
:s/正则表达式/替换字符串/选项
二、元字符
元字符是具有特殊意义的字符。使用元字符可以表达任意字符、行首、行 尾、某几个字符等意义。
元字符一览
元字符 | 说明 |
. | 匹配任意一个非空字符,不包括换行符 |
[abc] | 匹配方括号中的任意一个字符。可以使用-表示字符范围, |
[^abc] | 在方括号内开头使用^符号,表示匹配除方括号中字符之外的任意字符。 |
\d | 匹配阿拉伯数字,等同于[0-9]。 |
\D | 匹配阿拉伯数字之外的任意字符,等同于[^0-9]。 |
\x | 匹配十六进制数字,等同于[0-9A-Fa-f]。 |
\X | 匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f]。 |
\w | 匹配单词字母,等同于[0-9A-Za-z_]。 |
\W | 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]。 |
\t | 匹配<TAB>字符。 |
\s | 匹配空白字符,等同于[ \t],即空格和Tab |
\S | 匹配非空白字符,等同于[^ \t]。 |
另外,如果要查找字符 *、.、/等,则需要在前面用 \ 符号,表示这不是元字符,而只是普通字符而已。
元字符 | 说明 |
\* | 匹配 * 字符。 |
\. | 匹配 . 字符。 |
\/ | 匹配 / 字符。 |
\\ | 匹配 \ 字符。 |
\[ | 匹配 [ 字符。 |
量词
元字符 | 说明 |
* | 匹配0-任意个 |
\+ | 匹配1-任意个 |
\? | 匹配0-1个 |
\{n,m} | 匹配n-m个 |
\{n} | 匹配n个 |
\{n,} | 匹配n-任意个 |
\{,m} | 匹配0-m个 |
表示位置的符号
元字符 | 说明 |
$ | 匹配行尾 |
^ | 匹配行首 |
\< | 匹配单词词首 |
\> | 匹配单词词尾 |
环视和固化分组
vim居然还支持环视和固化分组的功能,强大,赞一个 关于环视的解释请参考Yurii的《精通正则表达式》 一书吧。
vim | Perl | 意义 |
\@= | (?= | 顺序环视 |
\@! | (?! | 顺序否定环视 |
\@<= | (?<= | 逆序环视 |
\@<! | (?<! | 逆序否定环视 |
\@> | (?> | 固化分组 |
\%(atom\) | (?: | 非捕获型括号 |
和perl稍有不同的是,vim中的环视和固化分组的模式的位置与perl不同。 例如,查找紧跟在 foo 之后的 bar,perl将模式写在环视的括号内, 而vim将模式写在环视的元字符之前。
# Perl的写法
/(?<=foo)bar/
# vim的写法
/\(foo\)\@<=bar
例子:
/char\s\+[A-Za-z_]\w*; " 查找所有以char开头,之后是一个以上的空白," 最后是一个标识符和分号
/\d\d:\d\d:\d\d " 查找如 17:37:01 格式的时间字符串
:g/^\s*$/d " 删除只有空白的行
:s/\<four\>/4/g " 将所有的four替换成4,但是fourteen中的four不替换
:s/\(\w\+\)\s\+\(\w\+\)/\2\t\1 将 data1 data2 修改为 data2 data1
:%s/\(\w\+\), \(\w\+\)/\2 \1/ 将 Doe, John 修改为 John Doe
:%s/\<id\>/\=line(".") 将各行的 id 字符串替换为行号
实例
实例一:删除不符合某个条件的记录
{ "_id" : "jevon_zhou", "created" : NumberLong("1387242000098") }, { "_id" : "zhazha319666@sina.com", "created" : NumberLong("1387242001038") }, { "_id" : "fofan.sign@gmail.com", "created" : NumberLong("1387242001727") }, { "_id" : "nathanjiali", "created" : NumberLong("1387242002210") }, |
目的:删掉其他的行,只保留“_id”对应的值。
1. 把以“_id”开头的行标为“%”开头 :%s/^.*_id" :\(.*\)$/%\1/g
2. 删除非“%”开头的行。 :g/^[^%].*$/d
实例二:贪婪,非贪婪
贪婪模式用’*',非贪婪模式就用’\{-}’
举例:
全文:<body> <list> <item> 啊</item> <item> 吧</item> <item> 才</item> </list> </body>
模式1:<item>.*<\/item>
匹配一个串,其内容为“<item> 啊</item> <item> 吧</item> <item> 才</item>”。
模式2:<item>.\{-}<\/item>
匹配三个串,其内容分别为“<item> 啊</item>“, ”<item> 吧</item>“, ”<item> 才</item>”。
Java实例
package com.mylearn.regular; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by IntelliJ IDEA. * User: yingkuohao * Date: 13-12-20 * Time: 上午10:44 * CopyRight:360buy * Descrption: * 正则表达式测试 * To change this template use File | Settings | File Templates. */ public class RegularTest { public static void main(String args[]) { method1(); method2(); } /** * 基本用法 */ private static void method1() { String target = "www.360buy.com! I love u!"; String regex = "www"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(target); boolean b = m.find(); if (b) { System.out.println("匹配"); } else { System.out.println("不匹配"); } } public static void method2() { Pattern p = Pattern.compile("m(o+)n", Pattern.CASE_INSENSITIVE); // 用Pattern类的matcher()方法生成一个Matcher对象 Matcher m = p.matcher("moon mooon Mon mooooon Mooon"); StringBuffer sb = new StringBuffer(); // 使用find()方法查找第一个匹配的对象 boolean result = m.find(); // 使用循环找出模式匹配的内容替换之,再将内容加到sb里 while (result) { m.appendReplacement(sb, "moon"); result = m.find(); } // 最后调用appendTail()方法将最后一次匹配后的剩余字符串加到sb里; m.appendTail(sb); System.out.println("替换后内容是" + sb.toString()); } } |
推荐: http://www.jb51.net/article/31251.htm