正则表达式、分组、子匹配子模式、非捕获子匹配子模式

网络编程 正则表达式 分类:[default] 更新日期: 2015-09-24
前面我们知道正则表达式有很多元字符表示匹配次数量词,都是可以重复匹配前面出现的单个字符次数,需要的朋友可以参考下

前面我们知道正则表达式有很多元字符表示匹配次数(量词),都是可以重复匹配前面出现的单个字符次数。有时候,我们可能需要匹配一组多个字符一起出现的次数。这个时候,我们需要分组了。就是用小括号来括起这些字符,指定子表达式(也叫做分组)。然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作。这个时候,可以把括号中一组字符,看作一个整体了。

分组模式举例说明

如:查找字符串中,连续出现多个win字符串的字符。可以这样完

<?php 
$str = "this is win winwindows!";
preg_match_all("/(win)+/",$str,$marr);
var_dump($marr);

正则表达式、分组、子匹配子模式、非捕获子匹配子模式

不用分组模式,同时匹配多个字符,可以吗? 我们发现以前操作符号:[win]+,尽管可以匹配到winwin字符,因为它代表是有w,i,n组合的一个或者多个字符,不会限制顺序。所见它会匹配到象:wwin,www,inw等等,只要是这3个字符组成的,多个字符都匹配成功了。

上面怎么匹配到,每一个有2个结果呢?这就是子模式(子匹配),默认除了可以将多个字符组合一个整体,另外还会把括号,括起来的这部分表达式存储到一个临时缓冲区中,以便后面正则表达式调用。上面这个例子里面,我们不需要,后期调用的。因此,怎么样屏蔽掉这个子表达式捕获内容呢? 只需要在:前加上”?:” 即可。我们看看下面例子正则表达式 分组非捕获模式。

正则表达式、分组、子匹配子模式、非捕获子匹配子模式

非捕获模式优点有哪些呢? 从上面看,可以减少捕获,也就会减少匹配次数。因此,在不必要分组表达式加入非捕获前缀”?:”,可以节省内存开销,并且可以提升匹配速度!

刚刚说到了正则表达式分组,默认情况会将子表达式捕获内容,存储到一个缓存区。以便后续调用。 那这个是什么样情况呢?其实,这个是正则表达式的引用。所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容按顺序存储。存储子匹配的缓冲区编号从1开始,最多可以一般存储为9。以便后面表达式引用该值,又叫后向引用。

我们看下下面例子,查找一个字符串中,互不相邻,出现多次系统单词:add。

<?php
$str = "add123456addasdf"; 
preg_match_all('/(add)\d+\1/',$str,$marr); 
var_dump($marr);

正则表达式、分组、子匹配子模式、非捕获子匹配子模式

反向引用,常用来处理一些处理一些特殊匹配情况。如:查找字符串中,不相邻重复字符串。查找html一对标签中内容。特别分析html非常常见了(注意,如果使用了反向引用,前面不能屏蔽子匹配捕获,也就是不能加”?:"前缀了)。经常会用:

<?php
$str = file_get_contents('http://blog.chacuo.net/');
preg_match_all('/<(\S+)[^>]*>[^<]*<\/\1>/',$str,$marr);
 
var_dump($marr);
 
// (\S+) 表示非显示字符之外所有字符,一般作为html tag名称
// tag格式一般为 <tag  其它属性> 后面[^>]* 匹配tag里面所有其它属性
// 后面的[^<]* 表示 <tag...>中间内容</tag> 表示中间内容,到"<"结束,因此匹配所有[^<]* 字符
// 最后的<\/\1> "\/" 转义"/"字符,后面的"\1" 表示反向应用前面的(\S+)

正则表达式、分组、子匹配子模式、非捕获子匹配子模式

以上是正则表达式使用比较重要的,分组,反向匹配,以及非捕获分组说明及实例。希望对要属性改功能朋友有所帮助。同时欢迎朋友们交流!


> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!

相关文章
  • 正则表达式性能优化方法高效正则表达式书写
    正则表达式性能优化方法高效正则表达式书写
    这里说的正则表达式优化,主要是针对目前常用的NFA模式正则表达式这里说的正则表达式优化,主要是针对目前常用的NFA模式正则表达式,详细可以参考:正则表达式匹配解析过程探讨分析(正则表达式匹配原理).从上面例子,我们可以推断出,影响NFA类正则表达式(常见语言:GNU Emacs,Java,ergp,less,more,.NET语言, PCRE library ...
  • python正则表达式学习小结
    这篇文章主要介绍了python 正则表达式学习小结的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下 在Python中实现正则的方式是通过re(regular expression的缩写)模块来实现的,你可以调用re模块的各种方法来实现不同的功能,下面我们就来说下,在Python中通过re模块可以调用那些方法,以及这些方法的作用都是什么:还有就是正则 ...
  • JavaScript中的正则表达式(推荐)
    正则表达式通常用于在文本中查找匹配的字符串,js正则表达式在程序开发中应用非常广泛,本文给大家介绍JavaScript 中的正则表达式推荐,感兴趣的朋友一起学习吧正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功:一旦有匹配不成功的字符则匹配失败. 正则表达式通常用于在文本中查找匹配的字符串.Python里数量词 ...
  • jQuery如何用正则表达式验证手机号、身份证号、中文名称
    这篇文章主要介绍了jQuery如何用正则表达式验证手机号.身份证号.中文名称 的相关资料,需要的朋友可以参考下数字判断方法:isNaN()函数 test()方法 判断字符串中是否匹配到正则表达式内容,返回的是boolean值 ( true / false ) // 验证中文名称 function isChinaName(name) { var pattern ...
  • 正则表达式单行、多行模式简介(使用说明)
    正则表达式单行、多行模式简介(使用说明)
    我们今天继续讨论下,它的单行,多行模式使用,及容易出现错误地方.单行,多行模式,都是正则表达式的模式修饰符里面出现的参数继上几篇正则表达式相关说明(详情:正则表达式 ),我们今天继续讨论下,它的单行,多行模式使用,及容易出现错误地方.单行,多行模式,都是正则表达式的模式修饰符里面出现的参数.目前常用正则表达式都有该使用选项,如:javascript 正则表达 ...
猜你喜欢