本帖最后由 SCAUSCNU 于 2011-03-13 01:41:55 编辑

解决方案 »

  1.   

    1、首先是双引号转义的问
    C#中字符串前有@的情况下,用""对"进行转义,没有@的情况下,用\"对"进行转义
    所以你找到的那个正则表达式,应该这样声明string test = "此正则表达式用于匹配源文件中类似于<a href=\"http://news.sohu.com\">搜狐新闻</a>的字符串";
    Regex reg = new Regex(@"<a\s+href\s*=\s*""?([^"" >]+)""?>(.+)</a>");
    MatchCollection mc = reg.Matches(test);
    foreach (Match m in mc)
    {
        richTextBox2.Text += m.Groups[1].Value + "\n";
        richTextBox2.Text += m.Groups[2].Value + "\n";
    }
    /*-----输出------
    http://news.sohu.com
    搜狐新闻
    */2、接下来是是否区分大小写的问题
    正则默认是区分大小写的,需要加(?i)模式忽略大小写
    string test = "但是像<A href=\"http://news.sohu.com\">搜狐新闻</A>这样的超链接是不是就判断不出来了?";
    Regex reg = new Regex(@"(?i)<a\s+href\s*=\s*""?([^"" >]+)""?>(.+)</a>");
    MatchCollection mc = reg.Matches(test);
    foreach (Match m in mc)
    {
        richTextBox2.Text += m.Groups[1].Value + "\n";
        richTextBox2.Text += m.Groups[2].Value + "\n";
    }
    /*-----输出------
    http://news.sohu.com
    搜狐新闻
    */3、这个正则表达式局限性很大,源字符串稍复杂一点就匹配不到了,改下
    string test = @"<A href=""http://news.sohu.com/1.html"">搜狐新闻1</A>
    <A href=http://news.csdn.net/2.html title=CSDN >床上等你新闻2</A>
    <a title='天朝' href='http://news.china.com/3.html' >天朝新闻3</a>";
    Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>.*?)</a>");
    MatchCollection mc = reg.Matches(test);
    foreach (Match m in mc)
    {
        richTextBox2.Text += m.Groups["url"].Value + "\n";
        richTextBox2.Text += m.Groups["text"].Value + "\n";
    }
    /*-----输出------
    http://news.sohu.com/1.html
    搜狐新闻1
    http://news.csdn.net/2.html
    床上等你新闻2
    http://news.china.com/3.html
    天朝新闻3
    */list里面查找是否含有字符串a,区分大小写应该是用contains快,不区分大小写视具体情况而定
      

  2.   

    1、在.net应用中,对字符串的处理推荐使用正则表达式,效率比字符串中先Index再Substring(Index,Length)高得多。
    2、若仅仅是查询某字符串中含有另一字符串,使用indexOf的效率比正则表达式相当,但是简单得多。注意,.net中的字符串类String是很奇怪的东西,他是一个引用类,但是又是很特殊的引用类,每得到新的字符串实际上都进行了一次hash算法,以及hash比较,在一定程度上浪费资源,而正则表达式的算法会省略很多这些步骤,所以还快些。比方说吧,你得到一个新的字符串,Mystr="abcdefg";
    .net会首先将这个字符串转换为一个hash值,然后在他内部维护的一个hash表中查找是否存在,若存在,则将这个字符串的地址传递给Mystr,若不存在,则在内存中创建string类实例,将"abcdefg"放入这个内存块,再将地址传递给Mystr。所以在.net中处理字符串的速度有点点慢,用正则表达式就会省很多这种步骤,在速度上会快得多。你试试split()函数和substring函数的效率就知道了。String.split()函数内部是引用正则表达式的Regex.split函数的,效率比Substring明显高得多。但仅仅是查找,则使用Index还略好。
      

  3.   

    我是想在一个泛型为list的很长的存储很多字符串里面查找,但是在csdn里面看到有的文章说正则表达式是编程的效率高,但是执行的效率低(我找找链接),谢谢楼上各位啦
      

  4.   

    Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>.*?)</a>");
    你这里应该是(?i)吧?
      

  5.   


    不大可能啊,我测试过的,凡是要取出字符串的操作,正则表达式都快得多,若仅仅只查询,可能字符串的一些函数速度会更快的,当然,正则表达式中不能有过多回溯,否则速度就慢了。我还是刚才那个例子,ABC|DEF|GHI 这个字符串,将DEF取出来,一种方法是用split,字符串的split引用了正则表达式的split,两者效率一致;另一种方法是正则表达式|(.{0,5}?)|;还有一种是Index("|")然后substring。这三种方法循环一百万次就可以看出谁效率高了。事实上正则表达式的效率远胜于字符串函数Substring。(第一种方法其实也是正则表达式)。以前我也听人家说过正则表达式效率不高,但是对于回溯少的正则表达式,其效率一定超过字符串函数。
      

  6.   

    (?i)是忽略大小写
    (?s)单行模式
    (?is)就是忽略大小写且单行模式
      

  7.   

    1、首先是双引号转义的问
    C#中字符串前有@的情况下,用""对"进行转义,没有@的情况下,用\"对"进行转义
    所以你找到的那个正则表达式,应该这样声明
    C# code
    string test = "此正则表达式用于匹配源文件中类似于<a href=\"http://news.sohu.com\">搜狐新闻</a>的字符串";
    Regex reg = new Regex(@"<a\……
      

  8.   

    查看泛型list里面是否包含某个字符串,应该不是很复杂吧
      

  9.   


    Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>.*?)</a>");请问你这个(?<url>[^'""\s>]+)怎么在表达式前面加上问号?
    \1,<url>,<text>是什么意思啊?text指前面的字符串吗?
    还有,你说有@两个引号表示一个,但是test = @"<A href=""http://news.sohu.com/1.html"">搜狐新闻1</A>里面有两个引号,你写的表达式貌似只判断了一个或者没有???
      

  10.   

    我测试过了,你第一个test = @"<A href=""http://news.sohu.com/1.html"">搜狐新闻1</A>查不出来的
      

  11.   


    (?<name>expression) 命名捕获组
    \number 反向引用
    我博客里都有,详细的可以去我博客里看至于后面的那个两个双引号的问题,C#的基础问题,说了是转义,我真的没什么好解释的
      

  12.   

    就用你这个例子测试的string test = @"<A href=""http://news.sohu.com/1.html"">搜狐新闻1</A>
    <A href=http://news.csdn.net/2.html title=CSDN >床上等你新闻2</A>
    <a title='天朝' href='http://news.china.com/3.html' >天朝新闻3</a>";
    Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>.*?)</a>");
      

  13.   


    你按我的代码测试,并且输出也是取的m.Groups["url"].Value和m.Groups["text"].Value?
      

  14.   

    改成这样就对了(?is)<a[^>]*?href=(['""]{0,2})(?<url>[^'""\s>]+)\1[^>]*>(?<text>.*?)</a>
      

  15.   


    如果test我这样赋值,你的source那一栏怎么放
    string test = "<A href=\"http://news.sohu.com/1.html\">搜狐新闻1</A>\r\n<A href=http://news.csdn.net/2.html title=CSDN >床上等你新闻2</A>\r\n<a title='天朝' href='http://news.china.com/3.html' >天朝新闻3</a>";你还是没搞明白什么是转义,先找本讲语言基础的书看下吧