【问题标题】:Do not match YouTube URLs with beginning double quotes - C# Regex不要匹配带有双引号开头的 YouTube URL - C# Regex
【发布时间】:2017-07-06 20:06:00
【问题描述】:

我有以下 C# 正则表达式

@"(?:https?:\/\/)?(?:www\.)?(?:(?:(?:youtube\.com\/watch\?[^?]*v=|youtu\.be\/)))([\w-]+)";

如何更正此问题,以便正则表达式不会匹配 URL 开头带有双引号的 URL。因此,如果 URL 在超链接中的 href 属性中,它将被忽略且不会被捕获。

我在我的另一个 Twitter 正则表达式模式中使用了这个表达式,但我不能让它在这个模式中工作。

(?<!"")

它适用于 Twitter 模式:

(?<!"")https?://twitter\.com/(?:#!/)?(\w+)/status(?:es)?/(\d+)

因此,YouTube 正则表达式应该只抓取 URL 开头没有双引号的 URL。

【问题讨论】:

  • this demo
  • 之前使用 html 解析器提取文本节点,这样可以避免所有 html 属性。 (如果您使用 XPath 查询,您甚至可以只选择包含字符串“youtu”的文本节点)
  • 其实如果只需要提取纯文本中的链接,最好用HtmlAgilityPack:public string getCleanHtml(string html) { var doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(html); return HtmlAgilityPack.HtmlEntity.DeEntitize(doc.DocumentNode.InnerText); }跨度>
  • @WiktorStribiżew 我有 HTMLAgilityPakck 我实际上在我的项目中使用它。
  • 您需要在 @"..." 中转义的一件事是引号字符本身...通过将 @"""" not 与反斜杠 @"\"" 加倍来转义它(并且不要不要像在您的评论中那样直接写它)

标签: c# regex regex-negation


【解决方案1】:

回答问题:如果当前位置紧邻之前没有"(?&lt;!") 将失败匹配。如果在当前位置之前必须没有 " 后跟 0+ 个其他字符,则可以利用 .NET infinite-width 向后查找。

在这种情况下,你可能想把你的后脑勺变成

(?<!"[^"<>]*)

请参阅regex demo。请注意,[^"&lt;&gt;]* 匹配除 "&lt;&gt; 之外的 0+ 个字符,因此," 仅在元素节点内时才会被检查 if HTML 完美序列化。如果它在属性值中包含普通的&lt;&gt;,则此方法将不起作用。

这就是为什么您也应该考虑为该任务使用适当的 HTML 解析器,因为您已经在项目中使用它。如果你让知道你想要达到的目标,我会更新答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多