2013-08-07 74 views
3

我用下面的數據形場的正則表達式,用於檢查輸入的文字是否與http://https://\\
正則表達式來檢查URL和共享文件路徑

我使用System.componentmodel.DataAnnotations開始.RegularExpressionAttribute

[Display(Name = "URL", Description = "URL")] 
[RegularExpression(@"^(http[s]{0,1}:\/\/|\\\\)", 
ErrorMessage = "Please enter valid Url or filepath")] 
public string URL { get; set; } 

但在數據形場,如果任何文本後HTTP enetered它拋出錯誤://https://開頭\\

http://google.com  ---failed 
https://aa  --failed 
\\a   ----failed 

我只是想通過所有上述情況......在高水平的正則表達式應該僅僅只檢查是否輸入的文本開始http://https://\\

即使數據形爲外地在用戶進入和刪除的文字,然後點擊tab.the錯誤引發錯誤網址爲必填字段,但我並沒有提及必需的屬性此屬性。 請幫忙

回答

1

您正在使用文字字符串,但您試圖將其轉義。

[RegularExpression(@"^(http[s]{0,1}:\/\/|\\\\)", 

一個文字字符串以@"..."開頭,不需要轉義。因此,無論使用

[RegularExpression("^(http[s]{0,1}://|[\\\\]{2})(?:[\\w][\\w.-]?)", 

[RegularExpression(@"^(http[s]{0,1}://|[\\]{2})(?:[\w][\w.-]?)", 

更新: 您還可以閱讀更多關於MSDN字符串文字:String Literals

更新2:這是一個常見的錯誤,和/不必在C#中轉義,它是perl語法。 在perl(和使用perl正則表達式擴展的PHP,所有的preg_xxx方法)中,必須設置一個分隔符。在這種語言中,正則表達式將以分隔符開始,該分隔符是顯示正則表達式模式的開始和結束的符號,即

/^(http[s]?:\/\/... /i第一個/是分隔符,這就是爲什麼//從http://開始被逃脫。

#^(http[s]?://... #i第一個#現在是分隔符,這就是爲什麼來自http://的//不必轉義。分隔符之後的指令(即我在這種情況下)只是告訴做一個區分大小寫的匹配

我用來測試它的一些例子:

 string[] inputs = { @"http://google.com", @"https://aa", @"\\a", @"\\\a" }; 
     Regex regEx = new Regex(@"^(http[s]{0,1}://|[\\]{2})(?:[\w][\w.-]?)+", RegexOptions.Compiled); 
     foreach(var input in inputs) { 
      var match = regEx.Match(input); 
      Console.WriteLine(string.Format("{0}:\t{1} => {2}", input, match.Success, match.Success?match.Groups[1].Value:string.Empty)); 
     } 

(?:[\w][\w.-]?)+末是要確保,它一個字,接着一個字,即\\一個應該是無效的,也不應該http://.somedomain.com

結果:

http://google.com:  True 
https://aa:  True 
\\a: True 
\\\a: False 
+0

Tseng:你是不正確的:文字@是C#編譯器最後四個斜槓是你正則表達式所需要的。 –

+0

它仍然會拋出錯誤 – shiv455

+0

是的,你是對的。我會更新這篇文章,併爲'\\\ a'添加一個特殊情況,它與目前爲止的任何一種reg ex模式都不匹配 – Tseng

0

他們沒有爲我失敗。我用RegEx.IsMatch()檢查了它。

但是如果你想在一開始你的正則表達式來檢查雙\應該是^(HTTP [S] {0,1}:// | \\)

您可以嘗試

^(http[s]?://|\\\\) 

這實際上等於您的正則表達式。

當你想要的正則表達式是資本不敏感的使用:

(?i)^(http[s]?://|\\\\) 

(?i)^(http[s]?://|\\\\).+$ 

增加:

我在MVC 4應用程序,它嘗試這種作品:

/// <summary> 
    /// Gets or sets the website. 
    /// </summary> 
    [RegularExpression(@"(?i)^(http[s]?://|\\\\).+$", ErrorMessage = "Not good website")] 
    public string Website { get; set; } 

是不是你的輸入莫名其妙地混亂。我知道PHP有一個功能,添加了魔術引號....

+0

甚至失敗 – shiv455

+0

shiv455你在用首都嗎? –

+0

當我使用http:// goo,https:// fg或\\ a時,它不會在所有3種情況下失敗,基本上,如果我們在輸入單個字母后輸入錯誤,它會拋出錯誤 – shiv455