检查URL和共享文件路径的正则表达式

3
我正在使用以下正则表达式来检查Dataform字段中输入的文本是否以http://https://\\开头。
我正在使用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://https://\\后输入任何文本,则会出现错误。

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

我只希望通过以上所有场景...从高层次上讲,正则表达式应该只检查输入的文本是否以http://https://\\开头。

即使用户输入并删除文本,然后点击选项卡,数据表格仍会为该字段抛出错误。错误信息是URL是必填字段,但我没有为此属性指定必填属性。请帮忙。

3个回答

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://中的//不需要转义。分隔符后的指令(在此情况下为i)只是告诉进行不区分大小写的匹配

我用来测试的一些示例:

        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.-]?)+是为了确保它后面跟着一个单词,例如\\a不应该被视为有效,http://.somedomain.com也不应该。
http://google.com:      True
https://aa:     True
\\a:    True
\\\a:   False

曾:您是错误的:字面量@是为C#编译器准备的,末尾的四个斜杠是您正则表达式所需的。 - Dev.Jaap
是的,你说得对。我会更新帖子,并添加一个特殊情况 \\\a,目前没有正确匹配任何正则表达式模式。 - Tseng
也许你可以解释一下它抛出了什么样的错误?当在带有Regex类的代码中使用时,上述所有代码都能正常工作。 - 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有一个功能可以添加魔术引号....


当我使用http://goo、https://fg或\\a时,无论在哪种情况下都会失败。基本上,如果我们在这些单词后面输入了一个字母,它就会抛出错误。 - shiv455
@Dev.Japp,你的最后一个解决方案对我有效,^(http[s]?://|\\).+$,但问题是当我输入任何无效输入并单击Tab键时,会抛出预期的错误,然后当我在字段中输入空白文本时,它会在Tab键之后抛出错误,错误为“URL字段是必需的”,但我没有将该属性指定为必需。 - shiv455
shiv455 我也亲自测试过,似乎 RegularExpressionAttribute 期望一个匹配所有内容而不仅仅是内容开头的正则表达式。我想知道这是否是设计上的问题...你所需的字段消息看起来很奇怪。我此刻唯一能想到的是它是否在你的数据模型中是必须的?你正在使用 EF 吗? - Dev.Jaap
开发者,实际上还有另一个字段[Display(Name = "ImageURI", Description = "Image URI")] [RegularExpression(@"([^\s]+(.(?i)(jpg|png|gif|bmp))$)", ErrorMessage = "请输入正确的图像URI格式,例如(xxx.jpg)")] public string ImageURI { get; set; },对于这个字段,它按预期工作,即不会为空文本抛出错误,不确定是否与正则表达式有关。 - shiv455
shiv455,我认为RegularExpressionAttribute并没有引发那个错误。尝试找出是哪段代码导致了该错误。 - Dev.Jaap
显示剩余4条评论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接