简单的正则表达式帮助使用c#(包括正则表达式模式)
本文关键字:正则表达式 包括 模式 帮助 简单 | 更新日期: 2023-09-27 18:09:49
我有一些网站源流我试图解析。我当前的正则表达式是这样的:
Regex pattern = new Regex (
@"<a'b # Begin start tag
[^>]+? # Lazily consume up to id attribute
id's*='s*['""]?thread_title_([^>'s'""]+)['""]? # $1: id
[^>]+? # Lazily consume up to href attribute
href's*='s*['""]?([^>'s'""]+)['""]? # $2: href
[^>]* # Consume up to end of open tag
> # End start tag
(.*?) # $3: name
</a's*> # Closing tag",
RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace );
但是它不再匹配链接了。我在这里包含了一个示例字符串
基本上我想匹配这些:
<a href="http://visitingspain.com/forum/f89/how-to-get-a-travel-visa-3046631/" id="thread_title_3046631">How to Get a Travel Visa</a>
"http://visitingspain.com/forum/f89/how-to-get-a-travel-visa-3046631/" is the **Link**
304663` is the **TopicId**
"How to Get a Travel Visa" is the **Title**
在我张贴的样本中,至少有3个,我没有计算其他的。
我还使用RegexHero(在线和免费),以查看我的匹配交互式添加到代码之前。
为了完整起见,这里是如何使用Html Agility Pack完成的,这是一个针对。net的健壮的Html解析器(也可以通过NuGet获得,所以安装它大约需要20秒)。
加载文档、解析文档并查找3个链接就像这样简单:
string linkIdPrefix = "thread_title_";
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load("http://jsbin.com/upixof");
IEnumerable<HtmlNode> threadLinks = doc.DocumentNode.Descendants("a")
.Where(link => link.Id.StartsWith(linkIdPrefix));
就是这样,真的。现在您可以轻松地获取数据:
foreach (var link in threadLinks)
{
string href = link.GetAttributeValue("href", null);
string id = link.Id.Substring(linkIdPrefix.Length); // remove "thread_title_"
string text = link.InnerHtml; // or link.InnerText
Console.WriteLine("{0} - {1}", id, href);
}
这很简单,标记改变了,现在href
属性出现在id
:
<a'b # Begin start tag
[^>]+? # Lazily consume up to href attribute
href's*='s*['""]?([^>'s'""]+)['""]? # $1: href
[^>]+? # Lazily consume up to id attribute
id's*='s*['""]?thread_title_([^>'s'""]+)['""]? # $2: id
[^>]* # Consume up to end of open tag
> # End start tag
(.*?) # $3: name
</a's*> # Closing tag
注意:
- 这就是为什么这是一个坏主意的主要原因。
- 群组号码变更。你可以使用命名组代替,当你在它:
(?<ID>[^>'s'""]+)
代替([^>'s'""]+)
。 - 引号仍然被转义(这在字符集中应该是OK的)
不要这样做(好吧,几乎,但不是每个人都这样做)。解析器就是用来做这种事情的