站长之家 正则表达式手册?

比如我想找所有以{开始并且以}结束的行,谢谢各位大虾

问题有点模糊,哪里用的正则?
不同的环境下,不同的应用有不同结果。

sed是强大,高效的处理正则表达式。一些复杂的任务,可以解决简单的正则表达式。任何命令行专家都知道正则表达式的威力。

本教程介绍了标准的正则表达式,POSIX类的正则表达式和元字符。考虑我们有一个文本文件 books.txt 将被处理,它有以下内容:

 
 
 
插入符号(^)符号用于一行的开始匹配。下面的例子打印所有的启动与模式“the”行。
 
执行上面的代码,会得到如下结果:
 
 
行尾是由美元符号($)符号表示。下面的例子打印“Coelho”结尾的行。
 
执行上面的代码,会得到如下结果:
 
 
点(.)匹配除行字符结尾的任何单个字符。下面的例子打印所有三个字母的单词字符 “t” 结尾。
 
执行上面的代码,会得到如下结果:
 

匹配字符集合 ([])

 
字符集是用方括号([])表示。它用来匹配只有1个之中的几个字符。下面的例子匹配模式“Call”和“Tall”,而不是“Ball”。
 
执行上面的代码,会得到如下结果:
 
 
当使用的字符集使用时,插入符否定集在方括号字符。只有下面的示例打印“Ball”。
 
执行上面的代码,会得到如下结果:
 
 
当被提供的字符范围,则正则表达式匹配在方括号中指定的范围内的任何字符。下面的例子匹配“Call”和“Tall”,而不是“Ball”。
 
执行上面的代码,会得到如下结果:
 
现在,让我们修改范围为“A-P”,并观察结果。
 
执行上面的代码,会得到如下结果:
 
 
问号(\?)匹配零个或一个匹配前面的字符。下面的例子匹配“Behaviour”和“Behavior”。在这里,我们通过使用“\?”使“u”作为一个可选的字符。
 
执行上面的代码,会得到如下结果:
 

一次或多次出现 (\+)

 
加号(\+)匹配前面的字符出现一次或多次。下面的例子匹配“2”出现一次或多次。
 
执行上面的代码,会得到如下结果:
 
 
星号(*)匹配零个或多个发生了前面的字符。下面的例子匹配"ca", "cat", "catt"等依此类推。
 
执行上面的代码,会得到如下结果:
 
 
{n}表达完全一致的“n”出现前面的字符。下面的例子打印只有三个数字。但在这之前,你需要创建以下文件,该文件仅包含数字。考虑 numbers.txt 有以下内容:
 
 
 
现在让我们编写 Sed 表达式。在这里,对花括号中的“\”字符转义。
 
执行上面的代码,会得到如下结果:
 
 
{n,} 表达式匹配,至少是“n”出现前面的字符。下面的例子打印大于或等于5个数字的所有数字。
 
执行上面的代码,会得到如下结果:
 
 
 
 
 
{m, n} 表达式匹配,至少是“M”和最“N”出现前面的字符。下面的例子打印所有具有至少5个数字,但不超过8位的数字。
 
执行上面的代码,会得到如下结果:
 
 
 
管道符的行为类似于逻辑或运算。它从管的两侧相匹配的条目。下面的例子要么匹配"str1" 和 "str3"。这里,一对括号和管道 (|) 由“\”字符转义。
 
执行上面的代码,会得到如下结果:
 
 
有哪些有在Sed有特殊含义的特殊字符。例如,用“\n”表示换行,回车被为“\r”表示,依此类推。要使用这些字符转换成普通的ASCII,我们必须使用反斜杠(\)字符转义。本章说明了转义特殊字符。
 
下面的例子匹配的模式“\”。
 
执行上面的代码,会得到如下结果:
 
 
下面的示例将新行字符匹配。
 
执行上面的代码,会得到如下结果:
 
 
 
执行上面的代码,会得到如下结果:
 
 
这个匹配一个字符的十进制ASCII码值是“nnn”。下面的例子中只匹配字符“a”。
 
执行上面的代码,会得到如下结果:
 
 
这个匹配字符的八进制ASCII码值是“nnn”。下面的例子仅匹配字符“b”。
 
执行上面的代码,会得到如下结果:
 
这个匹配字符的十六进制ASCII码值是“nnn”。下面的例子中只匹配字符“c”。
 
执行上面的代码,会得到如下结果:
 

正则表达式POSIX类

 
有哪些有Sed 特殊的含义一定的保留字。这些保留字被称为POSIX类正则表达式。本节介绍Sed支持POSIX类。
 
这意味着按字母和数字字符。下面的例子只匹配“One”和“123”,但不匹配制表符。
 
执行上面的代码,会得到如下结果:
 

 
这意味着只有字母字符。下面的例子只匹配单词“One”。
 
执行上面的代码,会得到如下结果:
 
 
这意味着空白字符可以是任何空格或制表符。下面的例子只匹配制表符。
 
执行上面的代码,会得到如下结果:
 
注意,该命令“cat -vte”用于显示制表符(^ I)中。
 
这意味着只有小数。下面的例子只匹配数字“123”。
 
执行上面的代码,会得到如下结果:
 
 
这意味着只有小写字母。下面的例子只匹配“one”。
 
执行上面的代码,会得到如下结果:
 
 
这意味着只有大写字母。下面的例子只匹配 "TWO".
 
执行上面的代码,会得到如下结果:
 
 
它意味着标点符号包括非空格或字母数字字符
 
执行上面的代码,会得到如下结果:
 
 
这意味着空格字符。下面的例子说明了这一点。
 
执行上面的代码,会得到如下结果:
 
 
像传统的正则表达式,Sed也支持特殊字符。这些是Perl风格正则表达式。需要注意的是元字符的支持是GNU Sed,可能无法与Sed的其他变种的工作。让我们详细讨论的元字符。
 
 
执行上面的代码,会得到如下结果:
 
 
“\B”元字符匹配非单词边界。例如,“the\B”匹配“,这些”these“和“they”而不是“the”。下面的例子说明了这一点。
 
执行上面的代码,会得到如下结果:
 
 
“\s”元字符意味着单个空格字符。下面的例子匹配“Line\t1”,但不匹配“Line1”。
 
执行上面的代码,会得到如下结果:
 
 
“\S”元字符意味着单个空格字符。下面的例子匹配“Line2”,但不匹配“Line\t1”。
 
执行上面的代码,会得到如下结果:
 
 
“\W”元字符意味着单个单词字符,即字母字符,数字和下划线(_)。下面的例子说明了这一点。
 
执行上面的代码,会得到如下结果:
 

单非单词字符 (\W)

 
“\W”元字符意味着一个非单词字符,以“\w”正好相反。下面的例子说明了这一点。
 
 

模式空间的开始 (\`)

 
“\”'元字符意味着将模式空间的开始位置。下面的例子只匹配单词“One”。
 
执行上面的代码,会得到如下结果:

《精通(第3版)》是正则这一万妙法门的经典名著,享誉海内外,中文版由IT世界的翻译奇才兼资深程序员余晟翻译。

随着互联网的迅速发展,几乎所有工具软件和程序语言都支持的也变得越来越强大和易于使用。《精通正则表达式(第3版)》是讲解正则表达式的经典之作。《精通正则表达式(第3版)》主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校措施,并详细介绍了正则表达式在perl、、.net、中的用法。

本书关注的是一种强大的工具——“正则表达式”。它将教会读者如何使用正则表达式解决各种问题,以及如何充分使用支持正则表达式的工具和语言。许多关于正则表达式的文档都没有介绍这种工具的能力,而本书的目的正是让读者“精通”正则表达式。许多种工具都支持正则表达式(文本编辑器、文字处理软件、系统工具、数据库引擎,等等),不过,要想充分挖掘正则表达式的能力,还是应当将它作为编辑语言的一部分。例如Java、JScript、VisualBasic、VBScript、JavaScript、ECMAScript、C、C 、C#、elisp、Perl、Python、Tcl、Ruby、PHP、sed和awk。事实上,在一些用上述语言编写的程序中,正则表达式扮演了极其重要的角色。正则表达式能够得到众多语言和工具的支持是有原因的:它们极其有用。从较低的层面上来说,正则表达式描述的是一串文本(achunkoftext)的特征。读者可以用它来验证用户输入的数据,或者也可以用它来检索大量的文本。从较高的层面上来说,正则表达式容许用户掌控他们自己的数据——控制这些数据,让他们为自己服务。掌握正则表达式,就是掌握自己的数据。

本书的第1版写于1996年,以满足当时存在的需求。那时还没有关于正则表达式的详尽文档,所以它的大部分能力还没有被发掘出来。正则表达式文档倒是存在,但它们都立足于“低层次视角”。我认为,那种情况就好像是教一些人英文字母,然后就指望他们会说话。第2版与第1版间隔了五年半的时间,这期间,互联网迅速流行起来,正则表达式的形式也有了极大的扩张,这或许并不是巧合。几乎所有工具软件和程序语言支持的正则表达式也变得更加强大和易于使用。Perl、Python、Tcl、Java和VisualBasic都提供了新的正则支持。新出现的支持内建正则表达式的语言,例如PHP、Ruby、C#,也已经发展壮大,流行开来。在这段时间里,本书的核心——如何真正理解正则表达式,以及如何使用正则表达式——仍然保持着它的重要性和参考价值。不过,第1版已经逐渐脱离了时代,必须加以修订,才能适应新的语言和特性,也才能对应正则表达式在互联网世界中越来越重要的地位。第2版出版于2002年,这一年的里程碑是.Framework和和PHP——的基础。为了帮助读者理解每一部分,我交叉使用各章的知识,为了提供尽可能方便的索引,我投入了大量的精力(全书中有超过1200处交叉引用,它们用符号加页码的形式标注)。在读完整个故事以前,最好不要把本书作为参考手册。在开始阅读之前,读者可以参考其中的表格,例如第92页的图表,想象它代表了需要掌握的相关信息。但是,还有大量背景信息没有包含在图表中,而是隐藏在故事里。读者阅读完整个故事之后,会对这些问题有个清晰的概念,哪些能够记起来,哪些需要温习。

一种类型的环视叫“顺序环视(lookahead)”,作为表达式的一部分,顺序环视顺序(从左至右)查看文本,尝试匹配子表达式,如果能够匹配,就返回匹配成功信息。肯定型顺序环视(positivelookahread)用特殊的序列(?=…)来表示,例如(?=\d),它表示如果当前位置右边的字符是数字则匹配成功。另一种环视称为逆序环视,它逆序(从右向左)查看文本。它用特殊的序列(?<=…)表示,例如(?<=\d),如果当前位置的左边有一位数字,则匹配成功(也就是说,紧跟在数字后面的位置)。

在理解顺序环视和其他环视功能时需要特别注意一点,即在检查子表达式能否匹配的过程中,它们本身不会“占用”任何文本。这可能有点难懂,所以我准备了下面的例子。正则表达式Jeffrey匹配:

但同样的正则表达式,如果使用顺序环视功能,即(?=Jeffrey),则匹配标记的位置:

顺序环视会检查子表达式能否匹配,但它只寻找能够匹配的位置,而不会真正“占用”这些字符。不过,把顺序环视和真正匹配字符的部分——例如Jeff——结合起来,我们能得到比单纯的Jeff更精确的结果。结合之后的正则表达式是(?=Jeffrey)Jeff,下一页的图说明,它只能匹配“Jeffrey”这个单词中的“Jeff”。它能够匹配:

在此处它的匹配和单纯的Jeff一样,但是下面的情况不会匹配:

Jeff自己能够匹配这一行,但是因为不存在(?=Jeffrey)能够匹配的位置,整个表达式就无法匹配。现在环视的好处还看得不是很明显,但是请不用担心,现在我们只需要关心顺序环视的原理——我们很快会遇到能够充分展现其价值的例子。

我要回帖

更多关于 正则表达式手册 的文章

 

随机推荐