正则表达式的懒惰匹配?
像+ * ? 以及{M,N}
这⼏种量词(匹配数量)默认是属于贪婪量词,进⾏贪婪匹配
什么叫做贪婪匹配呢?贪婪就是尽可能的多匹配,贪⼼的意思
⽐如现在⽬标字符串是 AAAA 四个A组成的字符串
A* 和 A+ 都会匹配 AAAA
A? 则会匹配 A
这就是贪婪匹配,实际运⽤中,有的时候我们却希望尽可能少的匹配
⽐如⽬标字符串<span>a</span><span>b</span>
此时如果我们使⽤了贪婪量词
<span>.*</span> 则会匹配 <span>a</span><span>b</span> 整个字符串
可是我们只想要匹配第⼀对span标签怎么办?
此时就需要⽤到懒惰量词,意思也很明显了,能偷懒就偷懒,呵呵,懒惰量词与贪婪量词的差别就是在贪婪量词的后⾯加个?号,就构成了懒惰量词
如下表
贪婪量词懒惰量词
A* A*?
A+ A+?
A? A??
A{M,N} A{M,N}?
还是以⽬标字符串 AAAA 来讨论
A*?
*号是匹配0次或多次,要偷懒怎么办呢?当然是最少次数了,也就是0 所以在这⾥匹配的结果是
没有匹配到任何内容
A+?
+是1次或多次,分析⽅法同上,最少次数是1次,所以匹配结果就是 A
A??
?是0次或1次,所以这⾥也不进⾏匹配,会偷懒吧,呵呵
再来看看刚刚的
<span>a</span><span>b</span>
要匹配第⼀对span,⽤懒惰量词就是<span>.*?</span>
我已经说的够明⽩了吧?这些内容我以前都是查了好多资料才知道的。
正则表达式是相当强⼤的语⾔,尤其在进⾏字符匹配和查时,当然要需要花⼀定的时间才能掌握,如果有问题可以百度HI我,进⾏探讨
总之, 我们平常看到的, ⽐较常⽤的 ".*?", 就是匹配最少的任意字符, 直到最近的后⾯那个"字⾯字符". //is, /\[.*?\]/is 以及其他两边是实体字符串、中间是.*?的就是包含最少的、最近的实体字符串的匹配内容."
'/[.*?]/is' 的就是在最近的两个 "字⾯字符" []之间的内容.
对于 $subject = "<span>acx</span><span>xxkk</span>"
#<span>.*</span># 这种贪婪匹配的是整个 "<span>acx</span><span>xxkk</span>";
#<span>.*?</span># 这种懒惰匹配, 的是: "<span>acx</span>" 最近的...
.点号, 是除了换⾏符 \n之外的任意字符.
.*+字⾯字符, 是指: 贪婪匹配, 直到最后⼀个出现的字⾯字符,
.*? + 字⾯字符, 是指: 懒惰匹配, ⼀旦发现第⼀次出现的字⾯字符就停⽌...
正则匹配中的附加参数:
/u是 utf-8 匹配, 针对汉字等多字节字符串, /i是insensitive, /s 与 /m是相对的, 表⽰/single /multiple, 是把字符串视为单⾏或者多⾏? 所以正则匹配或者正则替换的时候, 都是先写 preg_match_all('//is', subject,matches).然后再来写匹配模式字符串.
========================================
正则匹配是什么Processing math: 0%
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论