2009-10-21 144 views
1

我試圖用標籤替換一個包含url的文本與文本,我試圖使用類似這樣的東西,但我只是不明白爲什麼這是不工作,也許我太累了,也看到它。這裏是我的測試:Regex.Match與Regex.IsMatch的問題

[Test] 
    public void Check() { 
     string expUrl = @"^(https?://)" 
     + @"?(([0-9a-z_!~*'().&=+$%-]+:)?[0-9a-z_!~*'().&=+$%-][email protected])?" //[email protected] 
     + @"(([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檢查,但沒有通過匹配檢查?提前致謝。

+3

只是一個供參考,對於.NET正則表達式的測試,這是一個偉大的工具,最後一行:http://regexhero.net/tester/ – 2009-10-21 22:03:36

回答

4

因爲你用^開始你的正則表達式,並以$結束。那些指定匹配必須從字符串的開始處開始並結束於結尾。因爲你的比賽是在中間,所以沒有找到。

+0

謝謝很多,肯定是下午5點是很難得到一些錯誤 – 2009-10-21 22:08:36

2

由於您的正則表達式以「^」字符開頭,指示「https」應該先到達,以及$表示該字符串應以最後定義的組結束。

如果刪除^和$,這兩項測試將通過

+0

非常感謝,這是非常有益的 – 2009-10-21 22:09:09

1

^(https?://)

你要求它開始http

更新這條線從

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

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

和更新您從

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

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