日期:2014-05-18  浏览次数:20696 次

关于C#正则表达式的一个困惑
表达式如下句:
<\s*a\s*href[^ <> ]*\W+clients1.htm[\s\S]*> [\s\S]* </a>

在以下字符串中搜索
<a   href= "clients1.htm "> <span   class= "style16 "> Thomasnet </span> (美国1) </a> <br>
<a   href= "clients2.htm "> <span   class= "style16 "> Skf </span> (瑞典1) </a> <br>
<a   href= "clients3.htm "> <span   class= "style16 "> Rentalhomesplus </span> (美国2) </a> <br>
<a   href= "clients4.htm "> <span   class= "style16 "> Drilling </span> (美国3) </a> <br>
<a   href= "clients5.htm "> <span   class= "style16 "> Nwa </span> (美国4) </a> <br>
<a   href= "clients6.htm "> <span   class= "style16 "> Dunderdon </span> (瑞典2) </a> <br>
<a   href= "clients7.htm "> <span   class= "style16 "> Cingular   Wireless </span> (美国5) </a> <br>
<a   href= "clients8.htm "> <span   class= "style16 "> Sega </span> (美国6) </a>

得出结果为何是全部?
为何不是只到第一个 </a> 的内容?如下是我想要到得的:
<a   href= "clients1.htm "> <span   class= "style16 "> Thomasnet </span> (美国1) </a> <br>

请问如何修改我的表达式,从第一个a   href开始,到第一个 </a> 结束即可,只取这其中的内容?


------解决方案--------------------
如果按你的写法,应该改为这样

<\s*a\s*href[^ <> ]*\W+clients1.htm[\s\S]*?> [\s\S]*? </a>

用非贪婪模式,而不用贪婪模式
------解决方案--------------------
不过你的写法,前面那样写不好,一般来说,href=后可能为 '、 "或者直接接网址三种情况,可以这样写

<\s*a\s*href=([ ' "]?)clients1\.htm\1[^> ]*> [\s\S]*? </a>

.htm这里的.需要转义\.
之后用[^> ]*会比[\s\S]*?的效率高,且不易不现效率陷阱

关于贪婪模式和非贪婪模式,查一下相关资料吧