2013-08-07 72 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