我有一个很长的字符串(网站的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>
答案 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>).)+)");