我正在尝试用带有标签的文本替换包含url的文本,我正在尝试使用这样的东西,但我只是不明白为什么这不起作用,也许我太累了也看得出来了。这是我的测试:
[Test]
public void Check() {
string expUrl = @"^(https?://)"
+ @"?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //user@
+ @"(([0-9]{1,3}\.){3}[0-9]{1,3}" // IP- 199.194.52.184
+ @"|" // allows either IP or domain
+ @"([0-9a-z_!~*'()-]+\.)*" // tertiary domain(s)- www.
+ @"([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]" // second level domain
+ @"(\.[a-z]{2,6})?)" // first level domain- .com or .museum is optional
+ @"(:[0-9]{1,5})?" // port number- :80
+ @"((/?)|" // a slash isn't required if there is no file name
+ @"(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$";
const string url = "http://www.google.com";
var b = Regex.IsMatch(url, expUrl);
Assert.IsTrue(b);
var text = string.Format("this is a link... {0} end of link", url);
var resul = Regex.Match(text, expUrl);
Assert.IsTrue(resul.Success);
}
为什么url变量通过了IsMatch Check,但是没有通过Match检查?提前谢谢。
答案 0 :(得分:4)
因为您使用^
启动了正则表达式并以$
结束。这些指定匹配必须从字符串的开头开始并在结束时结束。由于你的比赛在中间,所以没有找到。
答案 1 :(得分:2)
因为你的正则表达式以“^”字符开头..表示“https”应该是FIRST,以及$表示字符串应该以最后定义的组结束。
如果删除^和$,则两个测试都将通过
答案 2 :(得分:1)
^(https?://)
您要求它以http
从
更新此行string expUrl = @"^(https?://)"
到
string expUrl = @"(https?://)"
并从
更新你的最后一行+ @"(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$";
到
+ @"(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)";