正则中多个零宽断言的匹配顺序是怎样的?

作者&投稿:桓费 (若有异议请与网页底部的电邮联系)
(正则表达式)怎样用零宽断言匹配出下面的结果~

(\b((?!\babc\b)[^\s])+\b)
匹配结果:
cabc
abcb
ddd
acc

\b\w*(?=q)\w*\b 匹配abdlqdjfa

\b\w*后面必须 是q字符 ,\b\w*匹配abdl,后面的\w*\b是可以 匹配 qdjfa的,当然 可以 匹配 整个字符 串
同理\b\w*(?<=q)\w*\b,\b\w*匹配 abdlq,\w*\b匹配 djfa
\b(?=q)\w*\b \b表示 单词边界 ,即单词的第一个字母 为q,abqdldjfa显然 不符,去掉最前面的\b,(?=q)\w*\b可以 匹配 qdjfa

首先,通过一些大牛的解释来看,<?=pattern>这个东西是断言一个位置,这个位置之后能够匹配pattern.然后就是匹配的过程需要简单分析一下.还是举个经典的例子来说明

$str='abc';
$re='/a(?=b)c/';

这样匹配是不成功的,事实上$re本身就是一个错误的正则表达式,不能匹配任何字符串.为什么这样呢?可以简单的把匹配的过程这样来理解:

在匹配开始前,把'abc'这个字符串分割成

0  a  1  b  2  c  3

这样的形式,其中0123是指进行匹配的位置,在一次匹配开始的时候,初始匹配的位置是0,然后

$re='/a(?=b)c/';

的第一个匹配项是a,理解为这个位置的后一个字符是a,那么位置0匹配成功,位置指向1,(?=b)理解为这个位置的下一个字符是b,也匹配成功,但是!!!重点来了,(?=b)这样的匹配不消耗字符,也就是说,匹配成功之后,匹配位置并不向后移动,这时位置仍停留在1上,接下来是c,理解为这个位置的后一个字符是c,而位置1之后的字符是b不是c,这样第一轮匹配失败!

接下来,以位置1开始匹配,同样失败.后面全部失败之后,整个匹配以失败结束.

所以,问题的关键就在于"<?=pattern>这个东西是断言一个位置,这个位置之后能够匹配pattern",开头这句话,而在实际匹配中,它又不使匹配位置向下移动.

现在回到题主的问题,就不难解答了.

/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$/

这样的正则表达式,可以这么理解,

有一个位置,它的后面匹配.*\d,然后回到这个位置上,接着匹配.*[a-z],然后返回匹配成功开始位置上,接着匹配.*[A-Z],匹配成功后,返回,接着匹配.{8,10}

这里没有接到^,在这个表达式里就是位置0.

这样就可以解释所谓匹配顺序的问题了.



<?php
$p='/^(?=(.*)\d)(?=(.*)[a-z])(?=(.*)[A-Z]).{8,}$/';
$s='ZXabcD1235X';
preg_match_all($p,$s,$m);
print_r($m);

这样是不是就符合你的预期了



正则表达式怎么完全匹配类似'A00A'?
答:第1位是:[a-zA-Z]第2至第4位是:[0-9a-zA-Z]{3}正则中,\b或\<\>为定界符,但是有些命令并不支持。如:推荐使用perl,它对正则元字符是完全支持的。但是这样的结果将匹配“Save”,“Robf”,“ABCD”分析三者不同,结合题目,只匹配单引号。使用零宽断言,答案为:(?<=')[a-zA-Z]...

正则表达式中两个不同的匹配条件怎么在一条语句里执行
答:3、如果不加上反斜杠就会出现错误。4、test = re.compile(r'[*]')另一种方法就是用中括号把星号括起来,这样也可以查找到。5、test = re.compile(r'6*')print(test.search("666*888"))实际上在正则表达式里面,星号代表这匹配0个或者多个,这里表示0个6,或者多个6。

求大神给我讲一些正则表达式的原理,谢啦。
答:请详细分析表达式(?<=).*(?=\1>),这个表达式最能表现零宽断言的真正用途。一个更复杂的例子:(?<=).*(?=\1>)匹配不包含属性的简单HTML标签内里的内容。(?<=)指定了这样的前缀:被尖括号括起来的单词(比如可能是),然后是.*(任意的字符串),最后是一个后缀(?=\1>)。注意后缀里的\/,...

[正则/Notepad++]用正则表达式怎么把1个10位整数提取出来?
答:很开心能回答你的问题,有什么不对的地方,欢迎指正。使用的是零宽断言,答案为:\d{9}\d?(?=,)注释:由于第三项是9位的数字,所以数字要满足9位或10位:\d{9}\d?寻找三个测试数据的共同点,发现后面都有逗号,但又不取逗号,故使用零宽断言 (?=,)匹配逗号的位置。把数字放前面,即:匹配...

mysql支不支持正则表达式里的零宽断言
答:确保可行再用,不行,就只好想其他办法了 参考资料:《Mysql中使用正则匹配》使用REGEXP关键字 1、基本字符匹配 SELECT prod_name From Products Where prod_name REGEXP'.000'LIKE和REGEXP区别 LIKE会匹配这个列,而REGEXP会在列值内进行匹配 在MySQL中正则表达式不区分大小写,要区分需使用BINARY...

谁能解释一下这个正则表达式 \b((?!abc)\w)+\b
答:(?!abc)的意义就是从当前匹配到的位置起,接下来不是一个字符"a"接着一个字符"b"接着一个字符"c"。(?!abc)\w的意义是用(?!abc)来限定\w的匹配,从\w的位置起不能出现一个字符"a"接着一个字符"b"接着一个字符"c"。((?!abc)\w)+就是多个被限定的\w组成的单词,这个单词中肯定不...

正则表达式匹配字符串的问题
答:所有的e编号的位置都是空字符。表达式(?!hede).会往前查找,看看前面是不是没有“hede”字串,如果没有(是其它字符),那么.(点号)就会匹配这些其它字符。这种正则表达式的“查找”也叫做“zero-width-assertions”(零宽度断言),因为它不会捕获任何的字符,只是判断。在上面的例子里,每个空字符都会检查...

正则表达式
答:[ ] [c1-c2] [^c1-c2] 匹配括号中的任何一个字符。例如正则表达式r[aou]t匹配rat、rot和rut,但是不匹配ret。可以在括号中使用连字符-来指定字符的区间,例如正则表达式[0-9]可以匹配任何数字字符;还可以制定多个区间,例如正则表达式[A-Za-z]可以匹配任何大小写字母。另一个重要的用法是...

如何合并两个正则表达式的条件
答:B. 必须包含英文的正则表达式 .*[a-zA-Z]C. 字符串长度是8-12位的正则表达式 ^.{8,12} 合并后结果:(?=.*\d)(?=.*[a-zA-Z])^.{8,12} 表示必须包含数字,必须包含字母,同时长度为8-12位的正则表达式 零宽断言语法:零宽断言有四类,它不匹配字符,只匹配一个位置,这和\b很...

vba到底支持正则零宽断言吗
答:支持零宽度正预测先行断言,不支持零宽度正回顾后发断言