<a href="http://www.abc.net" class="menua" target="_blank">网站</a> | <a href="111.asp" class="menua">联系我们</a>
<A href="http://www.yuixm.com/c37102.aspx">联系我们</A> 
<A href="http://www.yuixm.com/c37102.aspx"><FONT style="FONT-SIZE: 12px;font-weight: normal;">联系我们</font></A> </td>
<a href="news.asp" class="menua">新闻</a> | <a href="111.asp" class="menua"><FONT style="FONT-SIZE: 12px;font-weight: normal;">联系我们</font></a> 以上为待匹配文本;
需要匹配出"联系我们"的href属性。共四个111.asp(2个)、http://www.yuixm.com/c37102.aspx(2个);正则表达式如何写?

解决方案 »

  1.   

    try...            Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""]?)(?<url>[^'""\s>]*)\1[^>]*>(?:(?!</a|联系我们).)*联系我们");
                MatchCollection mc = reg.Matches(yourStr);
                foreach (Match m in mc)
                {
                    richTextBox2.Text += m.Groups["url"].Value + "\n";
                }
      

  2.   

    @"(?si)(?<=<a\s+((?!href).)*href\s*=[^""']?)[^""'> ]*(?=[^<>]*>联系我们</a>)
      

  3.   

    Console.WriteLine(Regex.Match(html,@"(?i)<a\shref=['""](?<href>.*?)['""].*?>联系我们</a>").Groups["href"].Value);
      

  4.   

    <a...>...</a><a...>...</a>这样会过多的匹配了a标记,需要非贪婪匹配。
      

  5.   

    href=后可能是“'”、“"”或直接接地址,\1是对前面捕获组的反向引用,作用就是使“'”或“"”配对出现(?:(?!</a|联系我们).)* 表示任意多个后面不是a标签或“联系我们”的字符,
      

  6.   


    任意多个后面不是a标签  我怎么感觉是这样写(?:.*(?!</a>)),反向声明:模式不应该紧邻在声明的后面,怎么这个任意多个(.)*跑到模式</a后面来了,修饰关系搞不明白了。再麻烦你一下  谢谢
      

  7.   

    排除单个字符时,我们可以用排除型字符组,比如[^a]表示不是“a”的任意字符但是如果想排除一字符序列呢?比如不是“abc”的子串时,则不能用[^abc],因为它表示的是除“c”、“b”、“a”之外的任意字符要实现这一需求,就要用到环视
    (?!abc).
    表示后面不是“abc”的任意一个字符
    ((?!abc).)*
    就表示,这样的字符任意多个,而实际应用中,这个字符并不需要被捕获,所以使用非捕获组
    (?:(?!abc).)*这样做的目的,是为了找到离“联系我们”最近的那个链接,而不充许中间再出现a标签,否则在匹配
    <a href="news.asp" class="menua">新闻</a> | <a href="111.asp" class="menua"><FONT style="FONT-SIZE: 12px;font-weight: normal;">联系我们</font></a> 
    时,匹配到的将是news.asp,而不是111.asp了