3

我在 Dataform 字段中使用下面的正则表达式来检查输入的文本是否以orhttp://开头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

我只想通过上述所有场景......在高级别上,正则表达式应该只检查输入的文本是否以or或 or开头http://https://\\

甚至当用户输入并删除文本并单击选项卡时,数据表单也会为该字段引发错误。错误是URL 是必填字段,但我没有提到此属性的必需属性。请帮忙

4

3 回答 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 regex estension 的 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
于 2013-08-07T14:11:02.250 回答
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 有一个添加魔术引号的功能....

于 2013-08-07T14:08:31.803 回答
0

您可以在library中找到很多正则表达式。例如:为您的任务

于 2013-08-07T14:10:26.787 回答