正则

来源:互联网 发布:pdf中文编辑软件 编辑:程序博客网 时间:2024/05/20 04:28

正则

一 VI中如何使用正则表达式

使用正则表达式的命令最常见的就是/ (搜索)命令。其格式如下:

/正则表达式

另一个很有用的命令就是 :s(替换)命令,将第一个//之间的正则表达式替换成第二个//之间的字符串。

:s/正则表达式/替换字符串/选项

二、元字符

元字符是具有特殊意义的字符。使用元字符可以表达任意字符行首行 尾某几个字符等意义。

元字符一览

元字符

说明

.

匹配任意一个非空字符,不包括换行符

[abc]

匹配方括号中的任意一个字符。可以使用-表示字符范围,
如[a-z0-9]匹 配小写字母和阿拉伯数字。

[^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


0 0