页面信息为http://www.google.com:C#代码为:
strResult = Regex.Replace(strPageContent, @"<style[.\n]*</style>", " ");
可是配不上“<style>[^<]</style>” 在这个例子里是可以工作的,
但是有时候,尖括号之间还包含尖括号,所以我写了上面的式子,但是不行。第一次发帖,请求帮助,谢谢大家!
strResult = Regex.Replace(strPageContent, @"<style[.\n]*</style>", " ");
可是配不上“<style>[^<]</style>” 在这个例子里是可以工作的,
但是有时候,尖括号之间还包含尖括号,所以我写了上面的式子,但是不行。第一次发帖,请求帮助,谢谢大家!
using System.Text.RegularExpressions;class Program
{
static void Main(string[] args)
{
string input = "前<style>http://www.google.com\n</style>后"; // 首先[.]是错误的,"."不可以直接放在[]里用
// <style>.*</style> 中的 * 是贪婪匹配符,它会尽量多匹配自己修饰的 ".",而无视</style>,将它匹配成"."。
// 解决方法是在 * 后边加上 ? 惰性匹配符。这样遇到</style>两可的情况会不袒护自己修饰的".",而结束"."的匹配。
// 另外你可以更改"."的定义,让它涵盖 /n 的意思,例如
System.Console.WriteLine(Regex.Replace(input, @"<style>.*?</style>", "", RegexOptions.Singleline));
// 或者这样,括号内相当于应用了 RegexOptions.Singleline 模式,这样 /n 也会被"."匹配掉。
System.Console.WriteLine(Regex.Replace(input, @"<style>(?s:.*?)</style>", "")); // 另一种更科学的阻止贪婪匹配的方法是使用零宽度断言,它表示一个右边界的存在(也有左边界的零宽度断言)
// 例如左侧以</style>结束的一串字符,可以用.*(?!</style>)表示。
System.Console.WriteLine(Regex.Replace(input, @"<style>.*(?=</style>)</style>", "", RegexOptions.Singleline));
Console.ReadKey(); // 此外你还说到多层尖括号,其实可以用平衡组定义取得每一层的内容。不过你好像只是要替换,就用不着那个了。
}
}
"<style[^>]*>[^<]*</style>"