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

2016-02-19 16:48 6 1 收藏

下面图老师小编要跟大家分享揭开正则表达式语法的神秘面纱,简单的过程中其实暗藏玄机,还是要细心学习,喜欢还请记得收藏哦!

【 tulaoshi.com - Web开发 】

  正则表达式(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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

  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

  

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

  Match at the beginning of a word

  s//blah/

  Inserts blah at the beginning of the word

  egrep blah sample.txt

  Matches blahfield, etc.

  

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

  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,欢迎你在其中的讨论区发表你的问题或观点

来源:http://www.tulaoshi.com/n/20160219/1613142.html

延伸阅读
正则表达式简介 翻译:NorthTibet 原文出处:Regular Expressions 有些新手对正则表达式不是很熟悉,有必要在此作一简单回顾。如果你是正则表达式高手,可以不用看这一部分。 正则表达式是描述字符串集的字符串。例如,正则表达式“Mic*”描述所有包含“Mic”,后跟零个或多个字符的字符串。Mickey、Microsoft、Michelangelo...
标签: Web开发
####################### #作者:雨浪 版权所有,翻版说一下 # #QQ:270499458 # ####################### 近段日子几个刚学了正则表达式的朋友问我在asp中怎么用.呵呵.虽然简单,还是写出来吧,正则表达式的基本知识我就不说了.其实已经有...
标签: Web开发
前言 正则表达式是烦琐的,但是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。只要认真去阅读这些资料,加上应用的时候进行一定的参考,掌握正则表达式不是问题。 索引 1. 引子 目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境,以...
标签: Web开发
最后写了一个IP地址的正则表达式验证程序。 代码如下: ((25[0-5]|2[0-4]\d|1?\d?\d)\.){3}(25[0-5]|2[0-4]\d|1?\d?\d) 截图如下:
标签: ASP
       最近很多帖子问如何将内容从数据库取出后换行,这就要用到正则表达式。简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。我们可以在许多编程语言中找到正则表达式的身影,例如,vi编辑器,Perl或PHP脚本语言,以及awk或sed shell程序等。此外,象JavaScript这种客户端的脚本语言也...

经验教程

260

收藏

33
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部