2013-08-07 5 views
3

Я использую ниже регулярное выражение для поля DataForm для проверки начинается ли введенный текст с 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; } 

но в DataForm поле он бросает ошибку, если какой-либо текст enetered после HTTP: // или https: // или \\

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

Я просто хочу, чтобы пройти все вышеуказанные сценарии ... на высоком уровне регулярное выражение должно только лишь проверить, является ли введенный текст начинается с http:// или https:// или \\

и даже DataForm бросает ошибку на поле, когда пользователь вводит и удалять текст и нажмите на tab.the ошибке URL требуется поле, но я не упоминаю требуюсь атрибут для этого свойства. Пожалуйста, помогите

ответ

1

Вы используете буквенную строку, но пытаетесь ее избежать.

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

Буквальное строка начинается с @"..." и не должны быть экранированы.Так что либо использовать

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

или

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

Update: Вы также можете прочитать больше о строковых литералов на MSDN: String Literals

Update 2: Это общая ошибка, и/не нужно также экранировать в C#, это синтаксис perl. В perl (и PHP, который использует perl regex estension, все методы 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

Ценг: Вы неверны: буквальный для компилятора 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, он терпит неудачу во всех трех сценариях, в основном, если мы вводим хотя бы одну букву после этих слов, она выдает ошибку – shiv455

Смежные вопросы