假设有这么一串字符:
<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,经过整理。