单个正则表达式匹配URL

时间:2014-07-31 14:07:36

标签: c# regex

我是如何使用单个正则表达式验证单个网址并匹配文本块中的网址的?

var x = "http://myurl.com";
var t = "http://myurl.com ref";
var y = "some text that contains a url http://myurl.com some where";

var expression = "\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[A-Z0-9+&@#/%=~_|]";

Regex.IsMatch(x, expression, RegexOptions.IgnoreCase); // returns true;
Regex.IsMatch(t, expression, RegexOptions.IgnoreCase); // returns false;

Regex.Matches(y, expression, RegexOptions.IgnoreCase); // returns http://myurl.com;

2 个答案:

答案 0 :(得分:1)

首先,你必须正确逃脱。使用"\\b..."代替"\b..."。对于部分匹配,IsMatch也是如此。您可以通过执行以下操作来检查整个输入是否匹配:

Match match = Regex.Match(x, expression, RegexOptions.IgnoreCase);

if (match.Success && match.Length == x.Length))
    // full match

通过此检查和转义修复,您的表达式将按原样运行。你也可以为它编写一个辅助方法:

private bool FullMatch(string input, string pattern, RegexOptions options)
{
    Match match = Regex.Match(input, pattern, options);

    return match.Success && match.Length == input.Length;
}

您的代码将更改为:

var x = "http://myurl.com";
var t = "http://myurl.com ref";
var y = "some text that contains a url http://myurl.com some where";

var expression = "\\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[A-Z0-9+&@#/%=~_|]";

FullMatch(x, expression, RegexOptions.IgnoreCase); // returns true;
FullMatch(t, expression, RegexOptions.IgnoreCase); // returns false;

Regex.Matches(y, expression, RegexOptions.IgnoreCase); // returns http://myurl.com;

答案 1 :(得分:0)

我认为边界这个词正在吸引你;它与非单词字符不匹配。

试试这个:

var expression = @"(^|\s)(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[A-Z0-9+&@#/%=~_|]($|\s)";

这会将匹配的开头绑定到字符串或空格的开头,并将匹配的结尾绑定到字符串或空格的末尾。


更多信息:http://www.regular-expressions.info/wordboundaries.html

  

有三种不同的职位符合词边界:

     

在字符串中的第一个字符之前,如果第一个字符是a   字符。在字符串中的最后一个字符后,如果是最后一个字符   character是一个单词字符。在字符串中的两个字符之间,   其中一个是单词字符而另一个不是单词字符。   简单地说:\ b允许你只执行一个"整个单词"搜索使用   \ bword \ b形式的正则表达式。一个"字符"是一个   可用于形成单词的字符。所有不是的字符   "字符"是"非单词字符"。