【问题标题】:Exclude string match using c# regex使用 c# regex 排除字符串匹配
【发布时间】:2012-09-26 07:34:40
【问题描述】:

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

<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)]*>

请问有人可以帮忙吗?

【问题讨论】:

  • str.indexOf( "BORDER" ) 将是 -1 ,对于第二个字符串。你可以用那个。您是否将所有三个语句都放在同一个变量中??

标签: c# html regex string negative-lookahead


【解决方案1】:

你可以使用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

【讨论】:

  • @goldenparrot 他正在尝试解决问题。正则表达式是一种解决方案,这是另一种解决方案。
【解决方案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();

【讨论】:

  • @L.B,你是什么意思?你看过 Regexr 的例子吗?
  • 是的,正如上面所说的0 capturing groups:
  • 是的,当然,我的正则表达式中没有捕获组。整个正则表达式匹配完整的 2 行/标签。
  • Regex.Matches(html, @"&lt;IMG\s(?:(?!BORDER)[^&gt;])*&gt;").Cast&lt;Match&gt;().ToList(); 也给出了 0 个匹配项。
  • 我添加了工作代码,完全使用了你的代码行,我不明白你的问题。
【解决方案3】:

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

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

链接:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 2010-11-22
    • 2014-11-18
    • 2020-02-01
    • 1970-01-01
    相关资源
    最近更新 更多