首页 > 代码库 > 正则表达式的元字符

正则表达式的元字符

利用Perl正则表达式还可以做另一件有用的事情,这就是使用各种元字符来搜索匹配。所谓元字符,就是用于构建正则表达式的具有特殊含义的字符,例如的“*”、“+”、“?”等。在一个正则表达式中,元字符不能单独出现,它必须是用来修饰原子的。如果要在正则表达式中包含元字符本身,使其失去特殊的含义,则必须在前面加上“\”进行转义。正则表达式的元字符如下表所示。

正则表达式的元字符
  构造正则表达式的方法和创建数学表达式的方法相似,就是用多种元素符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。元字符是组成正则表达式的最重要部分,下面将这些元字符分为几类分别讲解。
  ★限定符
  限定符用来指定正则表达式的一个给定原子必须要出现多少次才能满足匹配。有“*”、“+”、“?”、“{n}”、“{n,}”及“{n,m}”共6种限定符,它们之间的区别主要是重复匹配的次数不同。其中“*”、“+”、“{n,}”限定符都是贪婪的,因为它们会尽可能多地匹配文字。如下所示:
元字符中的限定符
  元字符“*”表示0次、1次、或多次匹配其前的原子,也可以使用“{0,}”完成同样的匹配。同样“+”可以使用“{1,}”表示,以及“?”可以使用“{0,1}”表示。
  ★边界限制
  用来限定字符串或单词的边界范围,以获得更准确的匹配结果。元字符“^”(或“\A”)和“$”(或“\Z”)分别指字符串的开始与结束,而“\b”用于描述字符串的每个单词的前或后边界,与之相反的元字符“\B”表示非单词边界。例如,有一个字符串“this is a test”,使用的边界限制如下所示:
边界限定符
  ★句号(.)
  在字符类之外,模式中的圆点可以匹配目标中的任何一个字符,包括不可打印字符。但不匹配换行符(默认情况下),相当于“[^\n]”(UNIX系统)或“[^\r\n]”(Windows系统)。如果设定了模式修正符好“s”,则圆点也会匹配换行符。处理圆点与处理音调符“^”和美元符“$”是完全独立的,唯一的联系就是它们都涉及换行符。如下所示:
  /a.b/       –可以匹配在a和b之间有任意一个字符的字符串,例如axb、ayb、azb等
  通常,可以使用“.*?”或“.+?”组合来匹配除换行符以外的任何字符串。例如,模式“/<b>.*?b<\/b>/”可以匹配以“<b>”标签开始,“</b>”可以匹配以“<b>”标签开始,“</b>”标签结束的任何不包括换行符的字符串。
  ★模式选择符(|)
  竖线字符“|”用来分隔多选一模式,在正则表达式中匹配两个或更多的选择之一。例如,模式“LAMP|J2EE”表示可以匹配“LAMP”也可以匹配“J2EE”,因为元字符竖线“|”的优先级是最低的,所以并不是表示匹配“LAMP2EE”或“LAMJ2EE”。也可以有更多的选择,例如模式“/Linux|Apache|MySQL|PHP/”表示可以从中任意匹配一组。
  ★模式单元
  模式单元是使用元字符“()”将多个原子组成大的原子,被当作一个单元独立使用。与数学表达式中的括号作用类似,一个模式单元中的表达式将被优先匹配。如下所示:
  ‘/(very)*good/’          –可以匹配good、very good、very very good或very very …good等
  在上面的例子中,紧接着“*”前的多个原子“very”用元字符“()”括起来被当作一个单元,所以原子“(very)”可以没有,也可以有一个或多个。
  ★后向引用
  使用元字符“()”标记的开始和结束多个原子,不仅是一个独立的单元,也是一个子表达式。这样,对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,可以被获取供以后使用。所捕获的每个子匹配都按照在正则表达式模式中从左致右所遇到的内容存储。存储子匹配的缓冲区编号从1开始,连续编号直至最大99个子表达式。每个缓冲区都可以使用’\n’访问,其中n为一个标识特定缓冲区的一位或两位十进制数。例如“\1”、“\2”、“\3”等的形式进行引用,在正则表达式的模式中使用时还需要在前面加上一个反斜线,将反斜线再次转义。例如“\\1”、“\\2”、“\\3”等。如下所示:
  ‘/^\d{4}\W\d{2}\W\d{2}$/’         –这是一个匹配日期的格式,如2008-08/08或2008/08-08等
  ’/^\d{4}(\W)\d{2}\\1\W\d{2}$/’    –这是一个匹配日期的格式,如2008-08-08或2008/08/08等
  在上面的例子中声明了两个正则表达式,用来匹配日期格式。如果使用第一种模式则在年、月及日之间的分隔符号可以是任意的特殊字符,完全可以不对应。但实际应用中日期格式之间的分隔符号必须是对应的。上述的第二个正则表达式就可以达到这种效果。这是因为模式“\W”加上了元字符括号“()”,结果已经被存储到缓冲区中。所以在第一个“(\W)”的位置使用“-”则下一个位置使用“\1”引用时,其匹配模式也必须是字符“-”。
  当需要使用模式单元而又不想存储匹配结果时,可以使用非捕获元字符“?:”、“?=”或“?!”来忽略对相关匹配的保存。在一些正则表达式中,使用非存储单元是必要的,可以改变其后向引用的顺序。如下所示:
  ’/(Windows)(Linux)\\2OS/’       –使用“\2”再次引用第二个缓冲区中的字符串“Linux”
  ’/(?:Windows)(Linux)\\1OS’      –使用了“?:”忽略了第一个子表达式的存储,所以“\1”引用的就是“Linux”
  ★模式匹配的优先级
  在使用正则表达式时,需要注意匹配的顺序。通常优先级是从左到右进行运算,不同优先级的运算先高后低。各种操作符的匹配顺序优先级从高到低如下表所示。
元字符模式匹配的顺序
 

>> 本文固定链接: http://php.ncong.com/php_course/php_zend/yuanzifu.html

>> 转载请注明: 恩聪php 2014年08月01日 于 恩聪PHP学习教程 发表