php正则表达式

[0-9]{2,4}(.*)[0-9]{1,2}\1[0-9]{1,2} 这个是一段简单的正则表达式
我想问 他得匹配过程是怎样的?比如说我输入2010-2011-2012 能够全部匹配,但是里面的2010,2011,2012也是能单个匹配的。优先匹配哪个?过程是怎样的,里面的(.*)是怎么找得?

优先匹配哪个?
通常是优先匹配左边的(从左往右执行嘛,然后又因为有贪婪性,比如[0-9]*[0-9]*去匹配123,左边的[0-9]*会匹配到12,右边的[0-9]*会匹配到3),正则表达式左边的部分会匹配到能是能使匹配成功的最长的匹配,具体原因如下:
贪婪、回溯和正则导向引正则擎的急切性:正则的{}和*合+有具贪婪性会向后匹配到他们可以匹配的尽可能多的字符串。但是如果重复性的匹配会引起整个(后面的)正则表达式匹配失败时,会引起回溯,放弃最后一次重复匹配(相当于剩余的字符串从左边增加了一位),用表达式后面的部分匹配剩余的字符串。在前面的正则匹配成功后立即用剩余的表达式部分继续匹配后面的内容,如果匹配成功会立刻返回匹配成功,不会继续回溯(php的正则表达式引擎室正则导向的)


里面的(.*)是怎么找得?
*有具贪婪性会向后匹配到.可以匹配的最大长度的字符串,最初匹配到-2011-2012,然后因为回溯不断减少匹配的值,直到匹配-201。

过程是怎样的,
执行顺序:
1.[0-9]{2,4}会先匹配到2010,
2.然后(.*),因为*得贪婪性会匹配到后面所有.能匹配的字符-2011-2012。
3.此时表达式执行到[0-9]{1,2},因为[0-9]{1,2}此时没有任何可以匹配的内容,所以引起回溯(.*)匹配到前一次匹配结果的倒数第2位重新匹配到-2011-201,[0-9]{1,2}与最后一位匹配成功得到字符串最后面的2,因为正则引擎的急切性,匹配成功后会立即用正则表达式剩余的部分继续向后匹配。
4.此时表达式执行到\1,字符串后面没有剩下任何东西所以\1 (\1指(.*)匹配的结果-2011-201)匹配失败,然后引起回溯。[0-9]{1,2}向前移一位,结果[0-9]{1,2}没有字符可以进行匹配操作,匹配失败。引起回溯,(.*)匹配到前一次匹配结果的倒数第2位重新匹配到-2011-20,再用[0-9]{1,2}匹配得到12,后面依然没有字符与\1匹配,引起回溯,此次[0-9]{1,2}匹配到1,\1(此时值为-2011-20)与2匹配再次失败。于是重复上面的回溯【此处省去n百字,总之是重复上面的回溯】,直到(.*)匹配到-201,\1匹配到了-2012中的-201,因为正则导向的正则引擎是急切的,不再进行回溯,继续后面的匹配。
5.最后,[0-9]{1,2}与字串剩余部(最后一个字符)2匹配成功返回,因为正则导向的正则引擎是急切的,所以立刻返回匹配结果,不再进行回溯。

睡觉前看到的没想到写出来这么难,不过也没白写,就当总结了。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-12-11
[0-9]{2,4}2到4个数字
(.*)
0-无数个任意字符
[0-9]{1,2}1到2个数字
\1不知道
[0-9]{1,2}1到2个数字
这个是一段简单的正则表达式本回答被网友采纳

PHP从入门到精通—正则表达式—初识正则表达式、正则表达式语法规则、相 ...
行定位符(^和$)通过行定位符(^和$),正则表达式支持定位功能,分别用于匹配字符串的开始和结束位置,精准控制字符在字符串中的定位。单词定界符(\\b和\\B)\\b用于匹配单词边界,而\\B匹配非单词边界,帮助识别文本中的单词分界,增强正则表达式的精确度。字符类 通过方括号表达式([]),正则表达式实...

超常用的PHP正则表达式收集整理
什么是正则表达式:简单的说,正则表达式是一种可以用于模式匹配和替换的强大工具。在几乎所有的基于UNIX\/LINUX系统的软件工具中找到正则表达式的痕迹,例如:Perl或PHP脚本语言。ThinkPHP的自动验证常用的正则一般我们见的比较多的是设置规则为require、email之类的,其实这些本身也是属于正则表达式验证方式,只是...

PHP常用正则表达式汇总
1、\\w就是匹配字母或数字或下划线或汉字,+则与*差不多,区别是+包括重复0次,而*就可以。=就ushi匹配=号两个斜杠则表示正则表达式的分界。2、正则表达式的限定符有:ThinkPHP的自动验证机制是为了进行表单数据验证,验证可以支持function、callback、confirm、equal、unique和regex,这里要讲的是使用正则...

求PHP 的正则表达式 大全
匹配中文字符的正则表达式: [\一-\龥] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^\\x00-\\xff] 评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 匹配空白行的正则表达式:\\n\\s*\\r 评注:可以用来删除空白行 匹配...

求php正则表达式 要求匹配 纯英文字符串#纯数字(位数不限), 谢谢_百度...
正则为:\/^[a-z0-9\\#]*$\/ 检测代码如下:str = '###1414adsad'; if (preg_match("\/^[a-z0-9\\#]*$\/", $str)) { echo "验证成功"; } else { echo "验证失败"; } 3. 可以改变$str的值来检测,该正则是否正确 ...

php 身份证的正则表达式怎么写?
IdCard = "\/^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$\/i";提示 :正则格式: ‘\/正则表达式\/模式修正符’;所以 添加 i 是忽略英文字母大小写的

php 16.什么是正则表达式,并举一个例子。
一、什么是正则表达式 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。二、例子:<?php$str = '我的电话号码是:12345678';$pt = '\/\\d+\/';preg_match_all($pt, $str, $arr);...

请问php 正则中的这些是什么编码呢?
一:[\\x81-\\xfe]格式的正则:s=preg_replace('\/^([\\x81-\\xfe][\\x40-\\xfe])*\/','0',$neirong); 这里面的大多是日韩文字 二:x{4e00}格式的正则:preg_match("\/^[\\x{4e00}-\\x{9fa5}]{1,4}\/u",$str); 这里面是匹配中文;———这些字符集尤其是日文字符集的各种字、...

PHP常用正则表达式
PHP常用正则表达式 header("Content-Type:text\/html;charset=utf-8"),这一句一般都是用于设置页面的字符集,防止出现乱码,虽然跟本节没多大关系,但也可以当作基础知识。\/\/匹配英文域名网址:http,https。域名中没有下划线,后缀为字母 1 2 3 preg = '\/^(https?:\/\/)?([a-zd.-]+).([a-z]...

超常用的PHP正则表达式收集整理
以下就是对超常用的PHP正则表达式进行的收集整理,为了方便大家更快更好的掌握php正则表达式。一、表单验证匹配 验证账号,字母开头,允许 5-16 字节,允许字母数字下划线:^[a-zA-Z][a-zA-Z0-9_]{4,15} 验证账号,不能为空,不能有空格,只能是英文字母:^\\S+[a-z A-Z]验证账号,不能有...

相似回答
大家正在搜