从给定字符串中提取 url 的 C# 正则表达式模式 - 不是完整的 html url,而是裸链接
Posted
技术标签:
【中文标题】从给定字符串中提取 url 的 C# 正则表达式模式 - 不是完整的 html url,而是裸链接【英文标题】:C# regex pattern to extract urls from given string - not full html urls but bare links as well 【发布时间】:2012-05-21 13:05:06 【问题描述】:我需要一个正则表达式来执行以下操作
Extract all strings which starts with http://
Extract all strings which starts with www.
所以我需要提取这 2 个。
例如下面有这个给定的字符串文本
house home go www.monstermmorpg.com nice hospital http://www.monstermmorpg.com this is incorrect url http://www.monstermmorpg.commerged continue
所以从上面给出的字符串我会得到
www.monstermmorpg.com
http://www.monstermmorpg.com
http://www.monstermmorpg.commerged
寻找正则表达式或其他方式。谢谢。
C# 4.0
【问题讨论】:
最近弹出机器人向我的游戏玩家发送网址。我不允许这样做:) 虽然我需要允许内部链接。 也许你应该考虑不使用正则表达式,因为它是解析 html 的一种尴尬方法...***.com/questions/590747/… 【参考方案1】:您可以编写一些非常简单的正则表达式来处理这个问题,或者通过更传统的字符串拆分 + LINQ 方法。
正则表达式
var linkParser = new Regex(@"\b(?:https?://|www\.)\S+\b", RegexOptions.Compiled | RegexOptions.IgnoreCase);
var rawString = "house home go www.monstermmorpg.com nice hospital http://www.monstermmorpg.com this is incorrect url http://www.monstermmorpg.commerged continue";
foreach(Match m in linkParser.Matches(rawString))
MessageBox.Show(m.Value);
说明 图案:
\b -matches a word boundary (spaces, periods..etc)
(?: -define the beginning of a group, the ?: specifies not to capture the data within this group.
https?:// - Match http or https (the '?' after the "s" makes it optional)
| -OR
www\. -literal string, match www. (the \. means a literal ".")
) -end group
\S+ -match a series of non-whitespace characters.
\b -match the closing word boundary.
基本上,该模式会查找以http:// OR https:// OR www. (?:https?://|www\.)
开头的字符串,然后匹配所有字符直到下一个空格。
传统字符串选项
var rawString = "house home go www.monstermmorpg.com nice hospital http://www.monstermmorpg.com this is incorrect url http://www.monstermmorpg.commerged continue";
var links = rawString.Split("\t\n ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Where(s => s.StartsWith("http://") || s.StartsWith("www.") || s.StartsWith("https://"));
foreach (string s in links)
MessageBox.Show(s);
【讨论】:
如果要解析 HTML 字符串的一部分,答案中的正则表达式不起作用。请改用以下一个:@"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?"
正则表达式 @"\b(?:https?://|www\.)[^ \f\n\r\t\v\]]+\b"
工作得更好一些(在我的情况下无论如何),就像 URL 包含在 BB 标记中一样,它将包含 ]
作为 URL 的一部分。
@TomGullen 公平点。但是,方括号实际上是有效的 URL 字符(根据 RFC 规范),因此我将按原样保留答案,因为它仅适用于最一般的情况。【参考方案2】:
使用Nikita's回复,我很容易得到字符串中的url:
using System.Text.RegularExpressions;
string myString = "test =) https://google.com/";
Match url = Regex.Match(myString, @"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?");
string finalUrl = url.ToString();
【讨论】:
【参考方案3】:不适用于包含 URL 的 html
例如
<table><tr><td class="sub-img car-sm" rowspan ="1"><img src="https://s3bucket/abc/xyzxyzxyz/subject/jkljlk757cc617-a560-48f5-bea1-f7c066a24350_202008210836495252.jpg?X-Amz-Expires=1800&X-Amz-Algorithm=abcabcabc&X-Amz-Credential=AKIAVCAFR2PUOE4WV6ZX/20210107/ap-south-1/s3/aws4_request&X-Amz-Date=20210107T134049Z&X-Amz-SignedHeaders=host&X-Amz-Signature=3cc6301wrwersdf25fb13sdfcfe8c26d88ca1949e77d9e1d9af4bba126aa5fa91a308f7883e"></td><td class="icon"></td></tr></table>
对于需要使用下面的正则表达式
Regex regx = new Regex("http://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?", RegexOptions.IgnoreCase);
【讨论】:
以上是关于从给定字符串中提取 url 的 C# 正则表达式模式 - 不是完整的 html url,而是裸链接的主要内容,如果未能解决你的问题,请参考以下文章