简单的正则表达式帮助使用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(在线和免费),以查看我的匹配交互式添加到代码之前。

简单的正则表达式帮助使用c#(包括正则表达式模式)

为了完整起见,这里是如何使用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的)

不要这样做(好吧,几乎,但不是每个人都这样做)。解析器就是用来做这种事情的