使用c#regex排除字符串匹配

时间:2012-10-05 07:06:48

标签: c# html regex string negative-lookahead

我是正则表达式的新手。我正在尝试找到没有BORDER的图像。所以结果应该是第二个Image。试图使用正则表达式进行匹配的文本如下。

<IMG onerror="this.errored=true;" USEMAP="#Map-43" BORDER="0"/>
<IMG onerror="this.errored=true;" USEMAP="#Map-43" />
<IMG onerror="this.errored=true;" USEMAP="#Map-43" BORDER="0"/>    

我尝试了以下正则表达式但没有效果

<IMG\\s[^((>)&(?!BORDER)]*>

那么有人可以帮忙吗?

3 个答案:

答案 0 :(得分:4)

您可以使用HtmlAgilityPack来解析html

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

var imgs = doc.DocumentNode.Descendants("img")
    .Where(n => n.Attributes["border"] == null)
    .ToList();

PS:另见:RegEx match open tags except XHTML self-contained tags

答案 1 :(得分:2)

更好的选择是使用html解析器来解决这个问题。

但是你的主要正则表达式问题是你把你的预测放到一个字符类中,这样所有字符都被视为文字字符。

<IMG\s(?:(?!BORDER)[^>])*>

应该更好。 See it on Regexr

但那仅仅是为了解释你的正则表达式问题。要解决您的编程任务,请使用L.B answer

工作示例:

String html = "<IMG onerror=\"this.errored=true;\" USEMAP=\"#Map-43\" BORDER=\"0\"/><IMG onerror=\"this.errored=true;\" USEMAP=\"#Map-43\" /><IMG onerror=\"this.errored=true;\" USEMAP=\"#Map-43\" BORDER=\"0\"/>";
Console.WriteLine(Regex.Matches(html, @"<IMG\s(?:(?!BORDER)[^>])*>").Cast<Match>().ToList()[0]);
Console.ReadLine();

答案 2 :(得分:0)

另一种方法是使用jQuery和CSS选择器获取客户端的“无边框属性”图像:

$img = $('img').not('[border]');

链接: