正则
来源:互联网 发布: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
- 正则
- 正则
- 正则
- 正则
- 正则
- 正则
- 正则
- 正则
- 正则
- 正则
- 正则
- 正则
- 正则
- 正则
- 正则
- 正则
- 正则
- 正则
- Douyu
- 数据重构4
- StackOverflow程序员推荐:每个程序员都应读的30本书
- spring hsqldb 测试潜入数据库 配置程序
- Relative imports
- 正则
- php 301重定向解决办法,超详细(附案例图)
- android 怎么关闭其他应用程序
- AndroidPN源码分析(包含client和server)
- Js apply 方法 详解
- iPhone retina屏的系统字体对应像素高
- 解决iOS程序UI主线程和定时器相互阻塞的问题
- ****Android动画效果translate、scale、alpha、rotate详解
- 小米HBase实践_刘绍辉