Ответ 1
private const String regex = @"^(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([a-zA-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+$";
У меня есть строка, которую я использую для проверки на стороне клиента:
private const String regex = @"^(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([A-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+$";
Я использую эту строку в моем атрибуте [RegularExpression(regex, ErrorMessage = "invalid")]
.
Я знаю, что флаг /i
для регулярного выражения Javascript используется для того, чтобы сделать регистр нечувствительным, но просто привязав его к концу моего регулярного выражения (т.е. @"^....$/i"
не работает - проверка регулярного выражения завершается полностью, независимо от введенного (действительного или нет).
Что мне не хватает?
private const String regex = @"^(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([a-zA-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+$";
Я создал этот атрибут, который позволяет вам указать RegexOptions. EDIT: он также интегрируется с ненавязчивой проверкой. Клиент будет подчиняться RegexOptions.Multiline и RegexOptions.IgnoreCase, поскольку это то, что поддерживает JavaScript.
[RegularExpressionWithOptions(@"[email protected]\.com", RegexOptions = RegexOptions.IgnoreCase)]
С#
public class RegularExpressionWithOptionsAttribute : RegularExpressionAttribute, IClientValidatable
{
public RegularExpressionWithOptionsAttribute(string pattern) : base(pattern) { }
public RegexOptions RegexOptions { get; set; }
public override bool IsValid(object value)
{
if (string.IsNullOrEmpty(value as string))
return true;
return Regex.IsMatch(value as string, "^" + Pattern + "$", RegexOptions);
}
public IEnumerable<System.Web.Mvc.ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ErrorMessage = FormatErrorMessage(metadata.DisplayName),
ValidationType = "regexwithoptions"
};
rule.ValidationParameters["pattern"] = Pattern;
string flags = "";
if ((RegexOptions & RegexOptions.Multiline) == RegexOptions.Multiline)
flags += "m";
if ((RegexOptions & RegexOptions.IgnoreCase) == RegexOptions.IgnoreCase)
flags += "i";
rule.ValidationParameters["flags"] = flags;
yield return rule;
}
}
JavaScript
(function ($) {
$.validator.unobtrusive.adapters.add("regexwithoptions", ["pattern", "flags"], function (options) {
options.messages['regexwithoptions'] = options.message;
options.rules['regexwithoptions'] = options.params;
});
$.validator.addMethod("regexwithoptions", function (value, element, params) {
var match;
if (this.optional(element)) {
return true;
}
var reg = new RegExp(params.pattern, params.flags);
match = reg.exec(value);
return (match && (match.index === 0) && (match[0].length === value.length));
});
})(jQuery);
Эта статья Энтони Стивенса помогла мне заставить это работать: ASP.NET MVC 3 Ненавязчивая проверка Javascript с помощью настраиваемых валидаторов
В С# вы можете встраивать некоторые параметры регулярных выражений. Чтобы указать возможность игнорировать случай, вы должны добавить (?i)
в начало вашего шаблона. Тем не менее, я не уверен, как это будет обрабатываться с помощью RegularExpressionAttribute
и если он обрабатывает перевод для клиентской стороны. Из моего опыта работы с ASP.NET RegularExpressionValidator
я сомневаюсь в этом; регулярное выражение должно быть достаточно ванильным, чтобы работать для обоих двигателей.
В любом случае, если он был действителен, он выглядел бы так:
@"^(?i)(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([A-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+$"