正则表达式找到缺少某些部分的字符串的子串

时间:2015-09-20 10:52:25

标签: c# regex

我有一个很长的字符串(网站的html),我想要刮掉子字符串。

例如,某些输出包含以下内容:

<span title="Minecraft: Pocket Edition" class="oneline-info title-info">
  <a href="/apps/ios/app/minecraft-pocket-edition/">Minecraft: Pocket Edition</a>
</span>


    <span title="Mojang" class="oneline-info add-info" data-items="1">
        <a href="/apps/ios/publisher/mojang/">Mojang</a>
    </span>

我想从<span title=</span>抓取所有内容(在上面的示例中,这意味着它将是2个不同的匹配项)

所以,我有这段代码:

        var matches = Regex.Matches(s, @"<span title=(?<content>(?:(?!""</span>).)+)");
        scrapeTitles.AddRange(matches.Cast<Match>().Select(x => x.Groups["content"].Value).ToList());

但由于某种原因,它并没有抓取这两个词之间的所有数据。它只给我这样的输出:

"Minecraft: Pocket Edition" class="oneline-info title-info">
"Mojang" class="oneline-info add-info" data-items="1">
"Clash of Clans" class="oneline-info title-info">
"Supercell" class="oneline-info add-info" data-items="1">

我需要抓取所有数据,包括<a>行。

"Mojang" class="oneline-info add-info" data-items="1">
            <a href="/apps/ios/publisher/mojang/">Mojang</a>

2 个答案:

答案 0 :(得分:2)

问题是你的比赛没有妥善照顾新的线路角色。

试试这个:

<span title=(?<content>(?:(.|\n)(?!</span>))+)

请参阅live version

免责声明:我强烈建议 NOT 使用正则表达式进行HTML(实际上是SGML)解析。从长远来看,这会导致行为破裂。

答案 1 :(得分:1)

您没有捕获换行符,因此要么更新正则表达式来解析它们,要么执行此操作:

var matches = Regex.Matches(s.Replace(Environment.NewLine, string.Empty), @"<span title=(?<content>(?:(?!""</span>).)+)");