ysdaniel的专栏

正则表达式热身

正则表达式(regularexpression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。

例如

转载请标明:

下面先举个简单例子来让大家对正则表达式有个直观的感受。

现在,我们只希望列出以d

举一反三,列出以che

是不是觉得有些觉得过于简单了啊??!!好吧,打完小怪,现在升下级。

开始……

如何列出当前目录下的所有目录

思考……

到了使出正则表达式杀手锏的时候了,在这里,我们还是使用ls正则表达式列出当前目录下的所有目录,我们给出了两种方法(聪明的你当然会想到也可以用find命令,呵呵,这属于第三种秘笈了)。且看:

这样列出来的内容有些多,没完全截下来所有显示结果,但这并不妨碍本文的讲解。

考虑到普通文件是以

所以我们就从

现在,,问题出来了,怎么统计出来有多少个“开头”的正则表达式,于是grep和正则表达式开始粉墨登场了……

ls-l|grep"^d"

这条简单的命令就轻松解决了我们的问题,。

谜底解开。现在你又想到,前面不是说还有一种方法的么,既然如此迫不及待,那就只好顺水推舟了。

第二种方法还是基于

仔细观察我们发现,在文件名后面,会多出了一些符号,如目录

我们现在把注意力集中到目录正则表达式表示出匹配行尾,答案已经很接近了……

ls-F|grep"/$"

这条短命令又一切成全了我们的梦想。"/$"也是正则表达式的用法,/$"

在此基础上,我们发散一下思维,比如说想统计当前目录下的文件个数及目录个数,就可以使用以下命令:

ls-l*|grep"^-"|wc-l

ls-l*|grep"^d"|wc-l

好了,暂且休息,下面我们开始介绍更多关于正则表达式的知识。

蓄势

前面我们初识了^$*这些个正则表达式的用法,下面我们将进行更高一级的升炼。

正则表达式是一个字符或和元字符组合成的字符集,它们匹配$*)。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

在这里,为简单见,我们不会介绍所有的正则表达式知识,只介绍常用的一些正则表达式知识。

一个正则表达式包含下面一个或多个项:

1.一个字符集

这里的字符集里的字符表示的就是它们字面上的意思

2.锚

一个锚指明了正则表达式在一行文本中要匹配的位置

3.修饰符

它们用于展开或缩小

* 匹配重复零次或多次前一字符

+ 匹配 符的情况

? 匹配零或一个前面的字符。它一般用于匹配单个字符

. 匹配任意字符

^ 匹配一行的开头集的意思[…] 匹配集合中任意字符如[^…] 匹配不属集合中任意字符^,$ 匹配行首、行尾\&;,\&; 用于表示单词的边界。\(…\) 正则表达式分组。进行子字符串提取(substringextraction)一起使用很有用\n 第n个分组内容

\ 转义了原来的字面意思解释成了字面上的意思"\&;

\{\} 指示前面正则表达式匹配的次数.

要转义是因为不转义的话大括号只是表示他们字面上的意思

| "

{n} n

{n,} n

{n,m} m

\b 匹配一个单词边界,也就是指单词和空格间的位置。例如,

\B 匹配非单词边界。

\w 匹配包括下划线的任何单词字符。等价于”[A-Za-z0-9_]”。

\W 匹配任何非单词字符。等价于”[^A-Za-z0-9_]”。

\d 匹配一个数字字符。等价于[0-9]。

\D 匹配一个非数字字符。等价于[^0-9]。

\f 匹配一个换页符。等价于

\n 匹配一个换行符。等价于

\r 匹配一个回车符。等价于

\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]。

\S 匹配任何非空白字符。等价于[^\f\n\r\t\v]。

\t 匹配一个制表符。等价于

\v 匹配一个垂直制表符。等价于

常用的就介绍到这里,其它的需要进一步了解可以查阅手册或资料。

转载请标明:

翱翔

部分例子

/\b([a-z]+)\1\b/gi 一个单词连续出现的位置

/(\w+):\/\/([^/:]+)(:\d*)?([^#]*)/ 将一个URL解析为协议、域、端口及相对路径

/^(?:Chapter|Section)[1-9][0-9]{0,1}$/定位章节的位置

/[-a-z]/ A

/ter\b/ 可匹配

/\Bapt/ 可匹配

/Windows(?=95|98|NT)/ 可匹配

下面来些更加高级些的例子。

对于vi中命令的分析

s/\(^.*$\)\n^.*$/\1/g

初一看,会傻眼,眼前感觉全是$^.*/\……这些符号的闪动。

不要紧,下面慢慢道来。

先给出vi中替换命令的格式。

s/re/string 用

如果在后面加了个g如: s/re/string/g

表示表示对该行内符合模式的进行全部替换。

例如,

好了,了解

前面介绍到

s/\(^.*$\)\n^.*$/\1/g

中的

类推,

好了,

%s/\(^.*$\)\n^.*$/\1/g

就可以写为:

s/AB/A/g

作用就是将行内所有的

现在我们来分别分析

A=\(^.*$\)

抽取出来实际上是

B=\n^.*$

分析:

再于是就有:

将两行(如行

从上面的分析过程中,我们总结出两条有用的正则表达式:

%s/\(^.*$\)\n^.*$/\1/g 删除偶数行

%s/^.*$\n\(^.*$\)/\1/g 删除奇数行

不过瘾的话,还可以再看看另一例子:

sed’s/\(.*\)\(.\)$/\2/’

\2就应该表示第二个正则表达式分组

同上,也将

分析

A=/\(.*\)

抽取出来实际上是

B=\(.\)$

括号内的

于是sed’s/\(.*\)\(.\)$/\2/’作用就是:删除该行除最后一个字符外的所有字符,保留最后一个字符,也即取得该行最后一个字符。

好了,正则表达式的介绍就告一段落,知识点比较多,需要平时反复的积累,遇到复杂的正则表达式时首先要克服恐惧的心理,然后按照上面的方法化繁为简,抓住其本质的东西,有如探囊取物,必手到擒来。

当明知不可挽回,唯一补偿的方法就是怀念,

ysdaniel的专栏

相关文章:

你感兴趣的文章:

标签云: