Сделать регистр с регулярным выражением нечувствительным в ASP.NET RegularExpressionValidator

Учитывая это регулярное выражение: "^[0-9]*\s*(lbs|kg|kgs)$", как сделать его регистрозависимым? Я пытаюсь использовать это в валидаторе регулярных выражений .net, поэтому мне нужно указать нечувствительность к регистру в шаблоне.

Я не могу использовать RegexOptions программно, потому что я задаю регулярное выражение в RegularExpressionValidator

Ответ 1

Я узнал.

С учетом регистра: ^[0-9]\s(lbs|kg|kgs)$

Нечувствительность к регистру: (?i:^[0-9]\s(lbs|kg|kgs)$)

Я считаю, что это относится к реализации регулярных выражений .NET. Поэтому, если вы используете это в RegularExpressionValidator, вы должны отключить проверку на стороне клиента, потому что парсер javascript regex не распознает токен ?i.

Ответ 2

Используйте RegEx Options.

Regex regExInsensitive = new Regex(@"^[0-9]\s(lbs|kg|kgs)$", RegexOptions.IgnoreCase);

В других языках вы можете обычно указывать модификатор RegEx после окончания Reg Ex; модификатор "нечувствительный к регистру" - "i":

В Perl:

if($var =~ /^[0-9]\s(lbs|kg|kgs)$/i) { # the /i means case insensitive
    # ...
}

В PHP:

if(preg_match("/^[0-9]\s(lbs|kg|kgs)$/i", $var)) {
    // ...
}

Ответ 3

Я знаю, что это было дано давно, и это лучший набор ответов среди других повторяющихся вопросов. Вот альтернатива, использующая CustomValidator, когда на самом деле нужна нечувствительность к регистру на стороне сервера и на стороне клиента; и подход верхнего/нижнего [A-Za-z] char слишком велик.

Это смешивает различные другие ответы, используя серверный объект RegEx и синтаксис javascript на стороне клиента.

CustomValidator:

<asp:CustomValidator ID="cvWeight" runat="server" ControlToValidate="txtWeight"
  OnServerValidate="cvWeight_Validate" ClientValidationFunction="cvWeight_Validate"
  ValidateEmptyText="true" Text="*" ErrorMessage="Invalid entry." />

Код позади:

protected void cvWeight_Validate(object sender, ServerValidateEventArgs args)
{
    Regex re = new Regex(@"^[0-9]*\s*(lbs|kg|kgs)$", RegexOptions.IgnoreCase);
    args.IsValid = re.IsMatch(args.Value);
}

Функция проверки на стороне клиента:

function cvWeight_Validate(sender, args) {
  var reWeight = /^[0-9]*\s*(lbs|kg|kgs)$/i;
  args.IsValid = reWeight.test(args);
}

Это отлично работает для меня, за исключением случаев использования ValidationSummary. При проверке на стороне клиента отображается ошибка *, но я не могу получить сообщение об ошибке для отображения в сводке. Сводка отображается только при отправке. Я думаю, что он должен отображаться; У меня есть сочетание панелей обновлений и старого кода, которые могут быть проблемы.

Ответ 4

Проще всего просто изменить регулярное выражение на

^[0-9]*\s*([lL][bB][sS]|[kK][gG][sS]?)$

Ужасно читать, но все будет хорошо.