正则表达式提取属性值

问题描述 投票:0回答:4

提取 HTML 表标题属性值的快速方法是什么,如下所示?

...
<li><a href="/wiki/Proclo" title="Proclo">Proclo</a></li>
<li><a href="/wiki/Proclus" title="Proclus">Proclus</a></li>
<li><a href="/wiki/Ptolemy" title="Ptolemy">Ptolemy</a></li>
<li><a href="/wiki/Pythagoras" title="Pythagoras">Pythagoras</a></li></ul><h3>S</h3>
...

因此它会在每一行的字符串中返回 ProcloProclusPtolemyPythagoras 等。我正在使用 StreamReader 读取文件。我正在使用 C#。

c# html regex
4个回答
40
投票

这个 C# 正则表达式将找到所有标题值:

(?<=\btitle=")[^"]*

C#代码是这样的:

Regex regex = new Regex(@"(?<=\btitle="")[^""]*");
Match match = regex.Match(input);
string title = match.Value;

正则表达式使用 Positive Lookbehind 来查找

title
值开始的位置。然后它会匹配所有内容直到结束双引号。


12
投票

使用下面的正则表达式

title="([^"]+)"

然后使用Groups浏览匹配的元素。

编辑:我修改了正则表达式以涵盖@Staffan Nöteberg 评论中提供的示例


0
投票

您可以将问题中的数据视为 XML,并使用 LINQ 提取“title”属性的值,从而避免在不适合的情况下使用正则表达式的问题。

using System.Xml.Linq;
//...
string snippet = @"<ul>
<li><a href=""/wiki/Proclo"" title=""Proclo"">Proclo</a></li>
<li><a href=""/wiki/Proclus"" title=""Proclus"">Proclus</a></li>
<li><a href=""/wiki/Ptolemy"" title=""Ptolemy"">Ptolemy</a></li>
<li><a href=""/wiki/Pythagoras"" title=""Pythagoras"">Pythagoras</a></li>
</ul>";

var xe = XElement.Parse(snippet);

var titles = xe.Elements("li").
                Elements("a").
                Attributes().
                Where(at => at.Name == "title").
                Select(ttl => ttl.Value);

Console.WriteLine(string.Join("\r\n", titles));

输出:

Proclo
Proclus
Ptolemy
Pythagoras

(我添加了最初的

<ul>
并在
</ul>
之后修剪了它。)


0
投票

改进了处理其他场景的模式:

  1. 属性通常用撇号而不是双引号括起来
  2. 非常罕见但有效的 xhtml 可以在等号之前或之后有空格
(?<=\btitle\s*=\s*['""])[^'""]*
© www.soinside.com 2019 - 2024. All rights reserved.