我在 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 是必填字段,但我没有提到此属性的必填属性. 请帮忙
最佳答案
您正在使用文字字符串,但您正试图对其进行转义。
[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
第一个 # 现在是定界符,这就是为什么//from 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# - 用于检查 url 和共享文件路径的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18105485/