深入分析正则表达式的子模式

 更新时间:2016年04月19日 10:01:52   投稿:hebedich  
在正则表达式中,可以使用“(”和“)”将模式中的子字符串括起来,以形成一个子模式。将子模式视为一个整体时,那么它就相当于一个单个字符。下面我们就来详细了解下子模式

首先,我们先看一段PHP代码:

<?php
  $time = date ("Y-m-d H:i:s");
  $pattern = "/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/i"; 
  if(preg_match($pattern,$time,$arr)){
  echo "<pre>";
  print_r($arr);    
  echo "</pre>";
  }
?>

显示结果:

Array
(
  [0] => 2012-06-23 03:08:45
)

有没有注意到,显示的结果只有一条数据,即符合匹配模式的时间格式,那如果只有一条记录的话,为什么还要用数组保存呢?直接使用字符串保存不是更好?

带着这个问题,我们来看下正则表达式中的子模式。

在正则表达式中,可以使用“(”和“)”将模式中的子字符串括起来,以形成一个子模式。将子模式视为一个整体时,那么它就相当于一个单个字符。

比如,我们将以上的代码稍微修改下,改成如下:

<?php
  $time = date ("Y-m-d H:i:s");
  $pattern = "/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/i"; 
  if(preg_match($pattern,$time,$arr)){
  echo "<pre>";
  print_r($arr);    
  echo "</pre>";
  }
?>

注意:我只修改了$pattern,在匹配模式中,使用了括号()

执行结果:

Array
(
  [0] => 2012-06-23 03:19:23
  [1] => 2012
  [2] => 06
  [3] => 23
  [4] => 03
  [5] => 19
  [6] => 23
)

总结:我们可以使用小括号给整个匹配模式进行分组,默认情况下,每个分组会自动拥有一个组号,规则是,从左到右,以分组的左括号为标志,第一个出现的分组为组号1,第二个为组号2,以此类推。其中,分组0对应整个正则表达式。
对整个正则匹配模式进行了分组以后,就可以进一步使用“向后引用”来重复搜索前面的某个分组匹配的文本。例如:\1代表分组1匹配的文本,\2代表分组2匹配的文本等等
我们可以进一步修改下代码,如下所示:

<?php
  $time = date ("Y-m-d H:i:s");
  $pattern = "/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/i";
  $replacement = "\$time格式为:$0<BR>替换后的格式为:\\1年\\2月\\3日 \\4时\\5分\\6秒";
  print preg_replace($pattern, $replacement, $time);
  if(preg_match($pattern,$time,$arr)){
    echo "<pre>";
    print_r($arr);    
    echo "</pre>";
  }
?>

注意:

因为是在双引号中,所以使用分组的时候应该使用两个反斜杠,如:\\1,而如果在单引号中,则使用一个反斜杠就可以了,如:\1
\\1用于捕获分组一种的内容:2012,\\6用于捕获分组6中的内容          
执行结果:

$time格式为:2012-06-23 03:30:31
替换后的格式为:2012年06月23日 03时30分31秒
Array
(
  [0] => 2012-06-23 03:30:31
  [1] => 2012
  [2] => 06
  [3] => 23
  [4] => 03
  [5] => 30
  [6] => 31
)

相关文章

  • 最新正则表达式、常用的正则大全

    最新正则表达式、常用的正则大全

    正则表达式是用于匹配和搜索文本模式的工具,它是一个强大且灵活的字符串处理工具,可以用来检查一个字符串是否符合特定的模式,或者从一个文本中提取满足条件的部分,近给大家分享常见的正则表达式元字符和它们的含义,感兴趣的朋友跟随小编一起看看吧
    2023-08-08
  • 正则表达式基础教程与说明

    正则表达式基础教程与说明

    正则表达式基础教程与说明...
    2007-03-03
  • 常用的正则表达式大全(数字、字符、固定格式)

    常用的正则表达式大全(数字、字符、固定格式)

    正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。本文给大家分享常用的正则表达式大全(数字、字符、固定格式),感兴趣的小伙伴一起学习吧
    2016-04-04
  • 2019手机号码JS正则表达式验证实例代码

    2019手机号码JS正则表达式验证实例代码

    这篇文章主要介绍了2019手机号码JS正则表达式验证实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-05-05
  • php的正则表达式完全手册

    php的正则表达式完全手册

    正则表达式是烦琐的,但是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。只要认真去阅读这些资料,加上应用的时候进行一定的参考,掌握正则表达式不是问题。
    2011-02-02
  • 正则表达式的基本语法汇总篇(推荐!)

    正则表达式的基本语法汇总篇(推荐!)

    一般开发中都会接触到正则表达式,作为一名合格的前端,也应该了解一下正则表达式编写原则,便于自己也能快速编写想要的正则表达式,下面这篇文章主要给大家介绍了关于正则表达式的基本语法汇总的相关资料,需要的朋友可以参考下
    2022-09-09
  • 正则表达式分组实例详解

    正则表达式分组实例详解

    这篇文章主要介绍了正则表达式分组实例详解,需要的朋友可以参考下
    2016-12-12
  • javascript正则表达式分析

    javascript正则表达式分析

    想必很多人都对正则表达式都头疼。今天,我以我的认识,加上网上一些文章,希望用常人都可以理解的表达方式来和大家分享学习经验。
    2008-05-05
  • 完美Email验证正则表达式

    完美Email验证正则表达式

    域名由各国文字的特定字符集、英文字母、数字及“-”(即连字符或减号)任意组合而成, 但开头及结尾均不能含有“-”,“-”不能连续出现
    2012-10-10
  • 正则表达式详述 二

    正则表达式详述 二

    正则表达式详述 二...
    2007-04-04

最新评论