揭开正则表达式语法的神秘面纱

语法|正则

正则表达式(REs)通常被错误地认为是只有少数人理解的一种神秘语言。在表面上它们确实看起来杂乱无章,如果你不知道它的语法,那么它的代码在你眼里只是一堆文字垃圾而已。实际上,正则表达式是非常简单并且可以被理解。读完这篇文章后,你将会通晓正则表达式的通用语法。

支持多种平台

正则表达式最早是由数学家Stephen Kleene于1956年提出,他是在对自然语言的递增研究成果的基础上提出来的。具有完整语法的正则表达式使用在字符的格式匹配方面上,后来被应用到熔融信息技术领域。自从那时起,正则表达式经过几个时期的发展,现在的标准已经被ISO(国际标准组织)批准和被Open Group组织认定。

正则表达式并非一门专用语言,但它可用于在一个文件或字符里查找和替代文本的一种标准。它具有两种标准:基本的正则表达式(BRE),扩展的正则表达式(ERE)。ERE包括BRE功能和另外其它的概念。

许多程序中都使用了正则表达式,包括xsh,egrep,sed,vi以及在UNIX平台下的程序。它们可以被很多语言采纳,如HTML 和XML,这些采纳通常只是整个标准的一个子集。

比你想象的还要普通
随着正则表达式移植到交叉平台的程序语言的发展,这的功能也日益完整,使用也逐渐广泛。网络上的搜索引擎使用它,e-mail程序也使用它,即使你不是一个UNIX程序员,你也可以使用规则语言来简化你的程序而缩短你的开发时间。

正则表达式101
很多正则表达式的语法看起来很相似,这是因为你以前你没有研究过它们。通配符是RE的一个结构类型,即重复操作。让我们先看一看ERE标准的最通用的基本语法类型。为了能够提供具有特定用途的范例,我将使用几个不同的程序。

字符匹配

正则表达式的关键之处在于确定你要搜索匹配的东西,如果没有这一概念,Res将毫无用处。

每一个表达式都包含需要查找的指令,如表A所示。

Table A: Character-matching regular expressions

操作
解释
例子
结果

.
Match any one character
grep .ord sample.txt
Will match “ford”, “lord”, “2ord”, etc. in the file sample.txt.

[ ]
Match any one character listed between the brackets
grep [cng]ord sample.txt
Will match only “cord”, “nord”, and “gord”

[^ ]
Match any one character not listed between the brackets
grep [^cn]ord sample.txt
Will match “lord”, “2ord”, etc. but not “cord” or “nord”

grep [a-zA-Z]ord sample.txt
Will match “aord”, “bord”, “Aord”, “Bord”, etc.

grep [^0-9]ord sample.txt
Will match “Aord”, “aord”, etc. but not “2ord”, etc.

重复操作符
重复操作符,或数量词,都描述了查找一个特定字符的次数。它们常被用于字符匹配语法以查找多行的字符,可参见表B。

Table B: Regular expression repetition operators

操作
解释
例子
结果

?
Match any character one time, if it exists
egrep “?erd” sample.txt
Will match “berd”, “herd”, etc. and “erd”

*
Match declared element multiple times, if it exists
egrep “n.*rd” sample.txt
Will match “nerd”, “nrd”, “neard”, etc.

+
Match declared element one or more times
egrep “[n]+erd” sample.txt
Will match “nerd”, “nnerd”, etc., but not “erd”

{n}
Match declared element exactly n times
egrep “[a-z]{2}erd” sample.txt
Will match “cherd”, “blerd”, etc. but not “nerd”, “erd”, “buzzerd”, etc.

{n,}
Match declared element at least n times
egrep “.{2,}erd” sample.txt
Will match “cherd” and “buzzerd”, but not “nerd”

{n,N}
Match declared element at least n times, but not more than N times
egrep “n[e]{1,2}rd” sample.txt
Will match “nerd” and “neerd”


锚是指它所要匹配的格式,如图C所示。使用它能方便你查找通用字符的合并。例如,我用vi行编辑器命令:s来代表substitute,这一命令的基本语法是:

s/pattern_to_match/pattern_to_substitute/

Table C: Regular expression anchors

操作
解释
例子
结果

^
Match at the beginning of a line
s/^/blah /
Inserts “blah “ at the beginning of the line

$
Match at the end of a line
s/$/ blah/
Inserts “ blah” at the end of the line

\<
Match at the beginning of a word
s/\</blah/
Inserts “blah” at the beginning of the word

egrep “\<blah” sample.txt
Matches “blahfield”, etc.

\>
Match at the end of a word
s/\>/blah/
Inserts “blah” at the end of the word

egrep “\>blah” sample.txt
Matches “soupblah”, etc.

\b
Match at the beginning or end of a word
egrep “\bblah” sample.txt
Matches “blahcake” and “countblah”

\B
Match in the middle of a word
egrep “\Bblah” sample.txt
Matches “sublahper”, etc.

间隔

Res中的另一可便之处是间隔(或插入)符号。实际上,这一符号相当于一个OR语句并代表|符号。下面的语句返回文件sample.txt中的“nerd” 和 “merd”的句柄:

egrep “(n|m)erd” sample.txt

间隔功能非常强大,特别是当你寻找文件不同拼写的时候,但你可以在下面的例子得到相同的结果:

egrep “[nm]erd” sample.txt

当你使用间隔功能与Res的高级特性连接在一起时,它的真正用处更能体现出来。

一些保留字符
Res的最后一个最重要特性是保留字符(也称特定字符)。例如,如果你想要查找“ne*rd”和“ni*rd”的字符,格式匹配语句“n[ei]*rd”与“neeeeerd” 和 “nieieierd”相符合,但并不是你要查找的字符。因为‘*’(星号)是个保留字符,你必须用一个反斜线符号来替代它,即:“n[ei]\*rd”。其它的保留字符包括:

^ (carat)
. (period)
[ (left bracket}
$ (dollar sign)
( (left parenthesis)
) (right parenthesis)
| (pipe)
* (asterisk)
+ (plus symbol)
? (question mark)
{ (left curly bracket, or left brace)
\ backslash
一旦你把以上这些字符包括在你的字符搜索中,毫无疑问Res变得非常的难读。比如说以下的PHP中的eregi搜索引擎代码就很难读了。

eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$",$sendto)

你可以看到,程序的意图很难把握。但如果你抛开保留字符,你常常会错误地理解代码的意思。

总结
在本文中,我们揭开了正则表达式的神秘面纱,并列出了ERE标准的通用语法。如果你想阅览Open Group组织的规则的完整描述,你可以参见:Regular Expressions,欢迎你在其中的讨论区发表你的问题或观点。

时间: 2024-10-22 23:00:46

揭开正则表达式语法的神秘面纱的相关文章

SEO诊断服务:揭开网站排名的神秘面纱

  对于很多不了解SEO优化及搜索引擎工作原理的人来说,常常会发出:"为什么这个网站可以排在百度或谷歌首页?是怎么做到的?利用了什么SEO原理与技巧呢?"等等这样或那样的疑问.其实这些看似让我们迷惑不解的问题,都可通过SEO诊断优化服务来为你揭开揭开网站排名的神秘面纱.最后,你会发现也不过如此,原来就像1+1=2一样的简单,只是我们把它复杂化了,当别人问我们1+1=?的时候,我们觉得太过于简单了,别人不可能问这样的问题,而不敢说出答案. 当然上面所说的,我们看到别人的网站排名好想知道原

不再做“异教徒”——揭开数据库PostgreSQL的神秘面纱

中国云计算产业最具影响力的盛会之一--2016杭州云栖大会(https://yunqi.aliyun.com/)将在云栖小镇召开.连续举办七届的云栖大会一直是业界了解阿里云计算生态发展和应用趋势.体验前沿技术和产品的最佳平台,来自海内外的上万名开发者.创业者聚集于此,分享着他们对云计算的思考与实践经验.7年来,从产品发布到行业解决方案展示,从关注技术到技术与服务并重,从单一的客户到生态全景的展现,大会的核心内容一直在"进化",而2016年杭州云栖大会,则以"飞天・进化&quo

揭开主机营销的神秘面纱

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 现在网络营销盛行,无论是做哪一行的销售,都用到了网络营销,然而主机是不是也一样用到了营销的思想呢?就拿IX主机近期如此火爆来说吧,其实就是用了主机营销的思想,还为此成立了IX中文站现在我们就一起来揭开主机营销的神秘面纱吧. 一.了解站长心中的渴望 如果你不知道站长想要的是什么样的主机,对主机有哪些要求,渴望买到什么样的主机,你是无法完成销售的

揭开全体数据的神秘面纱(上)--疑读《大数据时代》(三)

在<大数据时代>中,迈尔-舍恩伯格告诉我们大数据时代的第一大特征就是"不是随机样本,而是全体数据".我们在上篇通过分析"北京地区吃过麦当劳的人数"这样一个最简单的信息需求,说明即使在大数据时代,随机样本分析也是必不可少的,因为现实中并不是对每个问题研究都具备一个可用的全体数据. 本文专门谈论所谓全体数据,为大家揭开全体数据的神秘面纱. 何为全体数据? 在<大数据时代>一书中,全体数据是与随机样本相对立的概念.迈尔大叔这样描述道:"首

腾讯微信——揭开房地产基金的神秘面纱

随着腾讯入股大众点评罿/a>的消息落地,腾讯股价再次创造了历史新高;与此同时,当天微信"我皿a href="http://news.pedaily.cn/industry/银行/" target="_blank">银行卡"中就出现了"今日美食"栏目.该栏目恰恰就是大众点评罿/a>的团购栏目〿a href="http://news.pedaily.cn/industry/互联罿" targe

VMware揭开Workspace ONE的神秘面纱

ZD至顶网服务器频道 02月11日 编译:近日,VMware揭开了盖在最终用户计算业务之上的神秘面纱,几年努力的成果终于呈现在大家面前.Workspace ONE是新产品的名字,这真是一个奇怪的选择,该公司最大的竞争对手Citrix的产品名称是Workspace Suite和Workspace Cloud. 相似之处并没有到此为止.这两家公司现在都提供支持单点登录的各种应用程序发布产品,几乎能够让使用任何设备的用户访问针对他们的需求.角色和权限进行了个性化的应用程序集.两者都有移动设备管理.两者

揭开美国网军神秘面纱 - 纯铜包裹建筑防信号外泄,随时可以让他国网络瘫痪

class="post_content" itemprop="articleBody"> 美国"棱镜"事件将多年来行踪神秘的美国网军曝光在公众视线.这支特殊的军队正是由美国四星级上将基斯·亚历山大历时 8 年一手打造,美国网军究竟有多强大-- 近日,美国<连线>杂志撰文,详细爆料亚历山大与他的神秘部队的前世今生,并称"是该到揭开地狱之门的时候了." 美国网络部队最高统帅基斯·亚历山大 首领--拥有对部队独立指

揭开证券行业信息化神秘面纱 证券云应用需谨慎

之前金价屡次刷新高点后又急速跳水,投资者不得不出售黄金以追缴其他市场上的保证金,某家公司的股票在大盘走低的情况下却逆势上涨,证券市场总是让人琢磨不透.而证券行业一直给人们一种不可探知的神秘感,其运作模式就更加神秘. 证券业作为最早应用http://www.aliyun.com/zixun/aggregation/32730.html">信息系统的行业之一,无论是在技术还是应用水平上都是比较领先的.券商作为乙方如何提供更好的用户体验?新技术在证券行业的使用程度又是如何?为此,ZDNet至顶网

揭开极端编程的神秘面纱

通过在编写代码之前编写测试使一切简单 简介:测试驱动的编程是 XP 困扰程序员的一个方面.对于测试驱动的编程 意味着什么以及如何去做,大多数人都做出了不正确的假设.这个月,XP 方面的 讲师兼 Java 开发人员 Roy Miller 谈论了测试驱动的编程是什么,它为什么可 以使程序员的生产力和质量发生巨大变化,以及编写测试的原理.请在与本文相 随的 论坛中提出您就本文的想法,以飨笔者和其他读者. 最近 50 年来,测试一直被视为项目结束时要做的事.当然,可以在项目进行 之中结合测试,测试通常并