微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

假设有这么一串字符:

<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.jb51.cc/regex/357472.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐