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

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

分组模式举例说明

如:查找字符串中,连续出现多个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+)

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索正则表达式
, 子模式
, 分组
, 子匹配
非捕获子匹配
正则表达式 捕获分组、正则表达式 分组匹配、js正则表达式分组匹配、正则表达式匹配模式、正则表达式的匹配模式,以便于您获取更多的相关知识。

时间: 2024-11-18 13:41:46

正则表达式、分组、子匹配(子模式)、非捕获子匹配(子模式)_正则表达式的相关文章

正则匹配原理之 逆序环视深入 ._正则表达式

说明:部分内容有待进一步研究和修正,因为最近工作太忙,暂时抽不出时间来,未研究过的可以跳过这一篇,想研究的不要被我的思路所左右了,有研究清楚的还请指正1 问题引出 前几天在CSDN论坛遇到这样一个问题: var str="8912341253789"; 需要将这个字符串中的重复的数字给去掉,也就是结果89123457. 首先需要说明的是,这种需求并不适合用正则来实现,至少,正则不是最好的实现方式. 这个问题本身不是本文讨论的重点,本文所要讨论的,主要是由这一问题的解决方案而引出的另一个

正则表达式(regex)入门、元字符(特殊字符)学习与提高_正则表达式

什么是正则表达式呢?正则表达式,又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),它是计算机科学的一个概念.正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串.几乎在各种计算机编程语言中都有用到.可以分为普通正则表达式.扩展正则表达式.高级正则表达式.普通正则表达式在linux shell中常用到,高级正则表达式语法规范,基本由perl演化而来.目前常见程序语言(php,perl,python,java,c#

C# 正则表达式经典分类整理集合手册第1/3页_正则表达式

有一段时间,正则表达式学习很火热很潮流,当时在CSDN一天就能看到好几个正则表达式的帖子,那段时间借助论坛以及Wrox Press出版的<C#字符串和正则表达式参考手册>学习了一些基础的知识,同时也为我在CSDN大概赚了1000分,今天想起来,去找<C#字符串和正则表达式参考手册>时,已经不知所踪了.(1)"@"符号 符下两ows表研究室的火热,当晨在"@"虽然并非C#正则表达式的"成员",但是它经常与C#正则表达式出双入

php正则表达式的模式修正符和逆向引用使用介绍_正则表达式

正则表达式的匹配先后顺序: 1.模式单元 2.重复匹配 ? * + {} 3.边界限定 ^ $ b B 4.模式选择 | 模式修正符: 模式修正符是标记在整个模式之外的. i :模式中的字符将同时匹配大小写字母. m :字符串视为多行. s :将字符串视为单行,换行符作为普通字符. x :将模式中的空白忽略. A :强制仅从目标字符串的开头开始匹配. D :模式中的美元元字符仅匹配目标字符串的结尾. U :匹配最近的字符串. PHP与正则表达式中的模式修正符 下面列出了当前在 PCRE 中可能使

正则表达式匹配不包含某些字符串的技巧_正则表达式

经常我们会遇到想找出不包含某个字符串的文本,程序员最容易想到的是在正则表达式里使用,^(hede)来过滤"hede"字串,但这种写法是错误的.我们可以这样写:[^hede],但这样的正则表达式完全是另外一个意思,它的意思是字符串里不能包含'h','e','d'三个但字符.那什么样的正则表达式能过滤出不包含完整"hello"字串的信息呢? 事实上,说正则表达式里不支持逆向匹配并不是百分之百的正确.就像这个问题,我们就可以使用否定式查找来模拟出逆向匹配,从而解决我们的问

JS正则表达式匹配检测各种数值类型(数字验证)_正则表达式

验证数字的正则表达式集 验证数字:^[0-9]*$ 验证n位的数字:^\d{n}$ 验证至少n位数字:^\d{n,}$ 验证m-n位的数字:^\d{m,n}$ 验证零和非零开头的数字:^(0|[1-9][0-9]*)$ 验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$ 验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$ 验证非零的正整数:^\+?[1-9][0-9]*$ 验证非零的负整数:^\-[1-9][0-9]*$ 验证非负整数(正整数 + 0) ^\d

php正则表达式匹配img中任意属性的方法_正则表达式

经常和图片打交道,不得不用到一些提取图片中scr.alt.title.等的属性,这里总结给大家一些常用的,感觉还不错,比较通用! PHP正则表达式匹配img中任意属性PHP 复制代码 代码如下: <?php /*PHP正则提取图片img标记中的任意属性*/ $str = '<center><img src="https://img.lookmw.cn/images/20100516000.jpg" height="120" width=&qu

JavaScript正则表达式校验非零的负整数实例_正则表达式

话不多说,请看实例代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></tit

JavaScript正则表达式校验非零的正整数实例_正则表达式

话不多说,请看实例代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></titl