【问题标题】:Character escaping in regular expression正则表达式中的字符转义
【发布时间】:2013-06-06 07:07:13
【问题描述】:

我使用这个正则表达式来匹配在 href 中包含特定单词的超链接

<a( .*?)? href=\".*?" + word + ".*?\"( .*?)?>.*?</a>

这将返回匹配链接的第一次出现

现在我需要找到所有具有相同匹配的超链接,我已经尝试过这个正则表达式:

/<a [^>]*\bhref\s*=\s*"[^"]*word.*?<\/a>/

我在让我的编译器接受这个表达式时遇到了一些问题。问题似乎是转义了一些特殊字符。看来这部分有问题

"[^"]

我尝试用 \ 转义 [,并将 @ 放在双引号前,但没有运气。

错误为“错误的编译常量值”。

有谁知道如何格式化这个正则表达式以满足编译器的要求?

【问题讨论】:

  • 你需要用""转义"..但是为什么要使用正则表达式呢。有什么理由不考虑html解析器

标签: c# regex escaping


【解决方案1】:

正则表达式不是解析 HTML 文件的好方法..

你应该使用htmlagilitypack

HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load("http://yourWebSite.com");

List<String> hrefLst=doc.DocumentNode
                        .SelectNodes("//a[@href]")
                        .Select(x=>x.Attributes["href"].Value)
                        .Where(y=>y.Contains(word))
                        .ToList();

hrefLst 现在拥有您所需的所有链接。

是不是很简单!

【讨论】:

    【解决方案2】:

    虽然您可以转义字符串中需要转义的所有内容,但是当字符串被 @-quoted 时,正则表达式更容易阅读。然后你唯一需要担心的是双引号,它需要加倍。

    string expression = @"/<a [^>]*\bhref\s*=\s*""[^""]*word.*?<\/a>/";
    

    注意:正如 cmets 所说,这个正则表达式可能会失败。我没有测试过,我只是修改它使其可以编译。

    【讨论】:

    • 这个正则表达式失败的案例有 1000 种!:P..不要使用正则表达式..我求你:(
    • @joey 或者你可以说“不需要开头和结尾的斜线”
    猜你喜欢
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 2010-09-21
    • 2020-07-24
    相关资源
    最近更新 更多