正则表达式最小匹配的写法

前端之家收集整理的这篇文章主要介绍了正则表达式最小匹配的写法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

假设有这么一串字符:

<p class=MsoNormal style='text-indent:31.5pt'>
    <a name="abc">
        <span lang=EN-US>1.</span>
    </a>
    <span style='font-family:宋体'>负责代码编写</span>
</p>

<p class=MsoNormal style='text-indent:31.5pt'>
    <a name="def">
        <span lang=EN-US>2.</span>
    </a>
    <span style='font-family:宋体'>负责单元测试;</span>
</p>  

<p class=MsoNormal style='text-indent:31.5pt'>
    <a name="ghi">
        <span lang=EN-US>3.</span>
    </a>
    <span style='font-family:宋体'>完成上级领导交办的其它任务。</span>
</p>

知道<a name="ghi">,如何编写正则表达式查找出父节点?

<p class=MsoNormal style='text-indent:31.5pt'>
    <a name="ghi">
        <span lang=EN-US>3.</span>
    </a>
    <span style='font-family:宋体'>完成上级领导交办的其它任务。</span>
</p>

刚开始的时候,这样写:

<p[\s\S]*?<a name="ghi"[\s\S]*?</p>

却拿到了全文。参考正则表达式30分钟入门教程:
http://deerchao.net/tutorials/regex/regex.htm
“贪婪与懒惰”章节说了这样的一个案例: a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabac的话,它会匹配aab而不是ab,因为正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权——The match that begins earliest wins。
要想只拿到匹配的,可以这样写:

<p[^>]*?>[^<]*?<a name="ghi"[\s\S]*?</p>

表示的意思:匹配

<p

开头的,紧接着任意个不是>的字符,这些字符越少越好,直到遇到>字符,然后紧接着任意个不是<的字符,这些字符越少越好,直到遇到

<a name="ghi"

然后紧接着是任意个字符,这些字符越少越好,直到遇到

</p>

为止,循环查找符合上述条件的字符串。

原文来自http://www.iteye.com/problems/98084,经过整理。

原文链接:https://www.f2er.com/regex/357472.html

猜你在找的正则表达式相关文章