Regex.Match与Regex.IsMatch的问题

时间:2009-10-21 21:52:18

标签: c# regex

我正在尝试用带有标签的文本替换包含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检查?提前谢谢。

3 个答案:

答案 0 :(得分:4)

因为您使用^启动了正则表达式并以$结束。这些指定匹配必须从字符串的开头开始并在结束时结束。由于你的比赛在中间,所以没有找到。

答案 1 :(得分:2)

因为你的正则表达式以“^”字符开头..表示“https”应该是FIRST,以及$表示字符串应该以最后定义的组结束。

如果删除^和$,则两个测试都将通过

答案 2 :(得分:1)

^(https?://)

您要求它以http

开头

更新此行
string expUrl = @"^(https?://)"

string expUrl = @"(https?://)"

并从

更新你的最后一行
+ @"(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$"; 

+ @"(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)";