php正则表达式使用的详细介绍(3)

   用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。
   其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。

例如: /(very)+/ 可以匹配very googd或者very very good

1、后向引用(逆向引用):

   如果在模式中定义标准括号组,则之后可以在正则表达式中引用它。这称为“逆向引用”,并且此类型的组称为 “捕获组”。

对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
   例如,在下面的正则表达式中,序列 \1 匹配在捕获括号组中匹配的任意子字符串:
            /(\d+)-by-\1/;   // 匹配字符串:48-by-48
         可以通过键入 \1, \2,..., \99 在正则表达式中指定最多 99 个此类逆向引用。

可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匹配的保存。

2、使用非捕获组和向前查找组:
      非捕获组是只用于分组的组,它不会被“收集” ,也不会匹配有限的逆向引用。可以使用 (?:和 ?!) 来定义非捕获组,如下所示:
       /(?:com|org|net);
     例如,注意在捕获组和非捕获组中加入 (com|org) 的区别(使用php来演示):

捕获组) :

复制代码 代码如下:


    $pattern = '/(\w+)@(\w+).(com|org)/'; 
    $str = "bob@example.com"; 
    preg_match($pattern, $str, $match); 
    print_r($match); 


Array
(
    [0] => bob@example.com
    [1] => bob
    [2] => example
    [3] => com
)

非捕获组) :

复制代码 代码如下:


    $pattern = '/(\w+)@(\w+).(?:com|org)/'; 
    $str = "bob@example.com"; 
    preg_match($pattern, $str, $match); 
    print_r($match); 


  Array
(
    [0] => bob@example.com
    [1] => bob
    [2] => example
)
         一类特殊的非捕获组是 “向前查找组” ,它包括两种类型: “正向前查找组”和 “负向前查找组” 。  使用 (?= 和?!) 定义正向前查找组,它指定组中的子模式位置必须匹配。但是,匹配正向前查找组的字符串部分可能匹配正则表达式中的剩余模式。例如,由于 (?=e) 在下列代码中是正向前查找组,它匹配的字符 e 可以被正则表达式的后续部分匹配,在本例中为捕获组 \w*):
 

复制代码 代码如下:


      $pattern = '/sh(?=e)(\w*)/i'; 
    $str = "Shelly sells seashells by the seashore"; 
    preg_match($pattern, $str, $match); 
    print_r($match); 
 


Array
(
    [0] => Shelly
    [1] => elly
)

使用 (?! 和) 定义负向前查找组,它指定该组中的子模式位置必须不匹配。例如:

模式:$pattern = '/sh(?!e)(\w*)/i';
Array
(
    [0] => shore
    [1] => ore
)
3.2 模式修正标志符

php正则表达式使用的详细介绍

此外还有:

U: 表示PCRE_UNGREEDY,表示非贪婪,相当于perl/python语言的.*?,在匹配过程中,对于.*正则,一有匹配立即执行,而不是等.*消费了所有字符再一一回退。

PHP正则表达式模式后面通常带有 /i, /is, /s, /isU等参数,那么这都是些什么东西呢?下面我们一起来看看:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/ea1e722af39d9e7f8ee54e9f42c26247.html