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

假设有这么一串字符:

<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,经过整理。

猜你喜欢

转载自blog.csdn.net/ithouse/article/details/80434867