@"[\s\S]*?(?<content>\<div id='Content'\>\<div[\s\S]*?\<\/div\>[\s\S]*?\<\/div\>)[\s\S]*";
上边是我写的一个正则表达式,然后匹配一段文本,因为文本中实际不存在这样的匹配,所以应该说就找不到匹配,但是用Regex.IsMath(txtConten)这样以行代码的时候,程序总是失去响应,不知道为什么,我现在需要的不是正确的表达式,而是,如果文本中不存在这样的匹配的时候,应该怎么办,才不至于使程序失去响应?

解决方案 »

  1.   

    really? I don't have any problems with the following code: string[] slist ={
    "<div id='Content'><div>abd</div>sdfdf</div>fsdfdsf",
    "xxxxxx xxxxx xxxx xxxxx"
    };

    Regex re = new Regex(@"[\s\S]*?(?<content>\<div id='Content'\>\<div[\s\S]*?\<\/div\>[\s\S]*?\<\/div\>)[\s\S]*", RegexOptions.IgnoreCase);
    foreach (string s in slist)
    {
    Console.WriteLine("{0} matches? {1}", s, re.IsMatch(s));
    }
      

  2.   

    思归,我用来测试的是CSDN短消息页面的HTML源码嗯,测试器确实死掉了,CPU占用率一直100%
    我觉得这很可能是FCL的一个缺陷
      

  3.   

    嗯,思归发现去掉前面的[\s\S]*?就可以了,我发现只要等很长时间,还是会出结果的(所以不是死循环之类)
    想了一下,最开头使用[\s\S]*或者[\s\S]*?,可以匹配所有文本,在这个地方分析器为了尽量匹配所有表达式,会在几乎每个点进行回逆查找,而如果要匹配的文本很大,那么就会很耗时实际上去掉开头的[\s\S]*?的表达式也能满足你的要求
      

  4.   

    看到两位大师回答我的问题,真是无比兴奋我加上前边的[\s\S]*?主要是为了,进行文本的替换
    对于较小的字符串来说不会出现问题,但是就像Sunmast(速马.上海)说的测试较长的HTML源码确实会导致程序失去响应