精通正则表达式-基础知识拓展.docVIP

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
精通正则表达式_基础知识拓展 2007-12-22 13:37 基础知识拓展 Expanding the Foundation 我希望,前面的例子和解释已经帮助读者牢固地打下了正则表达式的基础,也请读者明白,这些例子都很浅显,我们需要掌握的还有很多。 语言的差异 Linguistic Diversification 我已经介绍过大多数版本的egrep支持的正则表达式的特性,这样的特性还有很多,其中一些并不是所有的版本都支持,这个问题留到后面的章节讲解。 任何语言中都存在不同的方言和口音,很不幸,正则表达式也一样。情况似乎是,每一种支持正则表达式的语言都提供了自己的“改进”。正则表达式不断发展,但多年的变化也造就了数目众多的正则表达式“流派”(flavor)。我们会在下面的章节中见到各种例子。 正则表达式的目标 The Goal of a Regular Expression 从最宏观的角度看,一个正则表达式要么能够匹配给定文本(对egrep来说,就是一行文本)中的某些字符,要么不能匹配。在编写正则表达式的时候,我们必须进行权衡:匹配符合要求的文本,同时忽略不符合要求的文本。 尽管egrep不关心匹配文本在行中的位置,但对正则表达式的其他应用来说,这个问题却很重要。如果文本是这样: …zip is 44272. If you write, send $4.95 to cover postage and… 我们只希望找出包含「[0-9]+」的那些行,就不需要关心真正匹配的数字。相反,如果我们需要操作这些数字(例如保存到文件、添加、替换之类——我们会在下一章看到这样的处理),就需要关心确切匹配的那些数字。 更多的例子 A Few More Examples 在任何语言中,经验都是非常重要的,所以我会给出更多用正则表达式匹配常用文本结构的例子。 编写正则表达式时,按照预期获得成功的匹配要花去一半的工夫,另一半的工夫用来考虑如何忽略那些不符合要求的文本。在实践中,这两方面都非常重要,但是目前我们只关注“获得成功匹配”的方面。即使我没有对这些例子进行最全面彻底的解释,它们仍然能够提供有用的启示。 变量名 许多程序设计语言都有标识符(identifier,例如变量名)的概念,标识符只包含字母、数字以及下画线,但不能以数字开头。我们可以用「[a-zA-Z_][a-zA-Z_0-9]*」来匹配标识符。第一个字符组匹配可能出现的第一个字符,第二个(包括对应的「*」)匹配余下的字符。如果标识符的长度有限制,例如最长只能是32个字符,又能使用第20页介绍的区间量词「{min, max}」,我们可以用「{0,31}」来替代最后的「*」。 引号内的字符串 匹配引号内的字符串最简单的办法是使用这个表达式:「[^]*」。 两端的引号用来匹配字符串开头和结尾的引号。在这两个引号之间的文本可以包括双引号之外的任何字符。所以我们用「[^]」来匹配除双引号之外的任何字符,用「*」来表示两个引号之间可以存在任意数目的非双引号字符。 关于引号字符串,更有用(也更复杂)的定义是,两端的双引号之间可以出现由反斜线转义的双引号,例如nail–the–2\x4\–plank。在后面的章节讲解匹配实际进行的细节时,我们会多次遇到这个例子。 美元金额(可能包含小数) 「\$[0-9]+(\.[0-9][0-9])?」是一种匹配美元金额的办法。 从整体上看,这个表达式很简单,分为三部分:「\$」、「…+」和「(…)?」,可以大致理解为:一个美元符号,然后是一组字符,最后可能还有另一组字符。这里的“字符”指的是数字(一组数字构成一个数值),“另一组字符”是由一个小数点和两位数字构成的。 从几个方面来看,这个表达式还很简陋。比如,它只能接受$1000,而无法接受$1,000。它确实能接受可能出现的小数部分,但对于egrep来说意义不大。因为egrep从不关心匹配文字的内容,而只关心是否存在匹配。处理可能出现的小数部分对整个表达式能否匹配并没有影响。 但是,如果我们需要找到只包含价格而不含其他字符的行,倒是可以在这个表达式两端加上「^…$」。这样一来,可选的小数部分就变得很重要了,因为在金额数值和换行符之间是否存在小数部分,决定了整个表达式的匹配结果是否存在差异。 另外,这个正则表达式还无法匹配‘$.49’。你可能认为把加号换成星号能够解决问题,不过这条路走不通。在这我先卖个关子,答案留待第5章(F194)揭晓。 HTTP/HTML URL Web URL的形式可能有很多种,所以构造一个能够匹配所有形式的URL的正则表达式颇有难度。不过,稍微降低一点要求的话,我们能够用一个相当简单的正则表达式来匹配大多数常见的URL。进行这种检索的原因之一是,我只能大概记得在收到的某封邮件中有一个URL地

文档评论(0)

精华文档888 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档