正则表达式的最小匹配

时间:2022-05-22 05:38:42
在做提取网页正文的东西,用的HtmlAgilityPack 可是通过里面Document.InnerText()方法取出来的内容含有网页的注释信息,想把这些内容去除。如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

搜狐-中国最大的门户网站

<!--2008.1.1-->
      .
      .
      .
<!--asfadsfg-->

然后我是想通过正则表达式找出里面的注释以及第一段的信息,再将其删除,现在的正则表达式是这么写的:

string patternNote = @"(<!--[\S\s].*?-->)|(<![\S\s].*?>)";
可是这样不能把<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
给匹配到,如果不用 . 可以找到换行的 可是是最大匹配 我想做最小匹配不知道怎么做,求大神们帮忙

4 个解决方案

#1



            string str = @"<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN""
 ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"">sdjfksjfdlkdsjf<!--2008.1.1-->sjdfkjdd";

            Regex regex = new Regex(@"(?is)<[^>]*?>");
            MatchCollection mc = regex.Matches(str);
            foreach (Match item in mc)
                Console.WriteLine("匹配项:"+item.Value);

            Console.WriteLine();
            str = regex.Replace(str, "");
            Console.WriteLine("去除注释之后:"+str);

            Console.Read();

#2


效果如下图:
正则表达式的最小匹配

#3


(?is)<![^>]*>

#4


楼主的代码
string patternNote = @"(<!--[\S\s].*?-->)|(<![\S\s].*?>)";
用了[\s\S]表示任意字符,后面就不该再加小数点.了,小数点.匹配除换行符\n外的任意字符,所以这里匹配不了换行,去掉小数点可以满足你的要求
string patternNote = @"(<!--[\S\s]*?-->)|(<![\S\s]*?>)";
不过这样写效率比较低,可以用排除型字符组
string patternNote = @"<![^>]*>";

PS:由于这里不涉及到字母,也不涉及到小数点,所以不需要使用(?is)

#1



            string str = @"<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN""
 ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"">sdjfksjfdlkdsjf<!--2008.1.1-->sjdfkjdd";

            Regex regex = new Regex(@"(?is)<[^>]*?>");
            MatchCollection mc = regex.Matches(str);
            foreach (Match item in mc)
                Console.WriteLine("匹配项:"+item.Value);

            Console.WriteLine();
            str = regex.Replace(str, "");
            Console.WriteLine("去除注释之后:"+str);

            Console.Read();

#2


效果如下图:
正则表达式的最小匹配

#3


(?is)<![^>]*>

#4


楼主的代码
string patternNote = @"(<!--[\S\s].*?-->)|(<![\S\s].*?>)";
用了[\s\S]表示任意字符,后面就不该再加小数点.了,小数点.匹配除换行符\n外的任意字符,所以这里匹配不了换行,去掉小数点可以满足你的要求
string patternNote = @"(<!--[\S\s]*?-->)|(<![\S\s]*?>)";
不过这样写效率比较低,可以用排除型字符组
string patternNote = @"<![^>]*>";

PS:由于这里不涉及到字母,也不涉及到小数点,所以不需要使用(?is)