我开发了一个供我个人使用的应用程序,它解析来自Youtube发送到我的电子邮件帐户的邮件,然后从每条消息中提取视频URL。
我每两个月使用一次这个应用程序,下一个正则表达式完美运行了 1~2 年,我最后一次使用该应用程序:
C# 语法:
Regex urlRegex = new Regex("(content|href)="(?<url>(http|https)://www.youtube.com.+watch.+?)"", RegexOptions.IgnoreCase);
VB.NET 语法:
Dim urlRegex As New Regex("(content|href)=""(?<url>(http|https)://www.youtube.com.+watch.+?)""", RegexOptions.IgnoreCase)
但是,今天我注意到它不再工作了...他们用于编写正文内容的模板发生了一些变化。
以消息中的以下正文内容为例:
https://pastebin.com/VJS6bvMU
这是它应该在"url"组名称中匹配的内容:
https://www.youtube.com/attribution_link?a=IGCom2KEH-lFJgHW&u=/watch%3Fv%3DW0ToDn9jXW8%26feature%3Dem-lsp
这就是它目前匹配的:
https://www.youtube.com/attribution_link?a=IGCom2KEH-lFJgHW&u=/"><img alt="Youtube Logo" class="header_logo_size" height="30" src="http://www.gstatic.com/youtube/img/branding/youtubelogo/1x/youtubelogo_60.png" border="0" style="display:block"></a> </td></tr></tbody></table></td></tr><tr><td style="max-height:0px; font-size:0; display:none"><hr class="inner-container-width" width="600" style="height:0px; border:none; border-color:transparent; padding:0px; margin:0px"></td></tr><tr><td class="large-section-padding-height" height="20"></td></tr><tr><td><table class="inner-container-width" width="600" align="center" valign="center" cellspacing="0" cellpadding="0" border="0"><tbody><tr><td><table class="video-spotlight-width" width="600" align="center" cellspacing="0" cellpadding="0" border="0"><tbody><tr style=""><td colspan="3"><a href="https://www.youtube.com/attribution_link?a=IGCom2KEH-lFJgHW&u=/watch%3Fv%3DW0ToDn9jXW8%26feature%3Dem-lsp" class="nonplayable" style="text-decoration:none; display:block"><table aria-label="Astrid S - Dance Dance Dance (Official Music Video)" class="video-spotlight-width" width="600" align="center" background="http://i.ytimg.com/vi/W0ToDn9jXW8/sddefault.jpg?sqp=-oaymwEGCIAFEOgC&rs=AMzJL3m-iY1ZW8EiY3QwRalAMfq3atBT-Q&feature=em-lsp" height="338" cellspacing="0" cellpadding="0" border="0" style="background-repeat:no-repeat; background-size:cover; background-position:center"><tbody><tr style=""><td aria-label="Astrid S - Dance Dance Dance (Official Music Video)"><img src="https://www.gstatic.com/youtube/img/email/transparent_pixel.png" alt="Astrid S - Dance Dance Dance (Official Music Video)" width="600" style="max-height:300px"> </td></tr><tr aria-label="Astrid S - Dance Dance Dance (Official Music Video)" scope="row" style=""><td aria-label="Astrid S - Dance Dance Dance (Official Music Video)" class="footer-font" valign="bottom" width="600" style="color:#fff; text-align:right; font-size:12px"><div style="margin-bottom:8px; margin-right:8px; border-radius:2px; background-color:#E62117; padding:2px 4px; display:inline-block">PREMIERE</div></td></tr></tbody></table></a></td></tr><tr><td><table class="large-section-padding-height" height="16" cellspacing="0" cellpadding="0" border="0"><tbody><tr><td class="large-section-padding-height" height="16"></td></tr></tbody></table></td></tr><tr><td><table class="content-container-width" width="560" cellspacing="0" cellpadding="0" border="0" style="table-layout:fixed"><tbody><tr><td class="avatar-size" width="32" style="vertical-align:top"><a href=""><img class="avatar-size" src="https://lh6.googleusercontent.com/-YdGE1ZRP_7k/AAAAAAAAAAI/AAAAAAAAAAA/lTcGNRWN4cc/s88-c-mo/photo.jpg" width="32" border="0" style="display:block; border-radius:50%"> </a></td><td class="small-pad-width" width="16"></td><td><table class="content-container-width" width="540" cellspacing="0" cellpadding="0" border="0" style="table-layout:fixed"><tbody><tr><td valign="center"><table class="content-container-width" cellspacing="0" cellpadding="0" border="0" style="table-layout:fixed"><tbody><tr><td style="padding-bottom:4px"><a href="https://www.youtube.com/attribution_link?a=IGCom2KEH-lFJgHW&u=/watch%3Fv%3DW0ToDn9jXW8%26feature%3Dem-lsp
(请注意,正确的 url 在字符串的最末尾匹配。
如何修复我当前的正则表达式以仅匹配我指定的 url 并忽略左侧的所有"垃圾"?
PD:我不需要一个超级超复杂的正则表达式,它考虑了域名的变化(例如 youtu.be(和其他不会在任何邮件中指定的内容。我也不想为此弄乱HtmlAgilityPack或类似的库,因为当Youtube更改正文内容中的任何小东西时,它将需要更多的维护/更新。
使用
Regex urlRegex = new Regex("(content|href)="(?<url>(http|https)://www.youtube.com[^"]+watch[^"]+)"", RegexOptions.IgnoreCase);
查看证明
[^"]+
将匹配除"
以外的一个或多个字符,因此匹配永远不会溢出双引号。.+
贪婪地匹配除换行符以外的任何类型的字符。