Сделайте регулярное выражение нечувствительным к регистру в ASP.NET RegularExpressionValidator - PullRequest
37 голосов
/ 15 апреля 2010

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

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

Ответы [ 5 ]

51 голосов
/ 17 июня 2010

Я узнал.

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

без учета регистра: (?i:^[0-9]\s(lbs|kg|kgs)$)

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

23 голосов
/ 15 апреля 2010

Использовать Параметры RegEx .

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)) {
    // ...
}
4 голосов
/ 24 февраля 2013

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

Это смешивает различные другие ответы, используя серверный объект 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. При проверке на стороне клиента отображается ошибка *, но я не могу отобразить сообщение об ошибке в сводке. Сводка отображается только при отправке. Я думаю, что это должно показать; У меня есть набор панелей обновления и устаревшего кода, которые могут быть проблемами.

3 голосов
/ 15 апреля 2010

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

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

Это ужасно читать, но будет работать нормально.

1 голос
/ 04 июня 2018

Можем ли мы сделать Regex без учета регистра в C # ? : Да

Установить опцию inline через (?i) шаблонную конструкцию или через RegexOptions.IgnoreCase param

Можем ли мы сделать Regex без учета регистра в JavaScript ? : Да

Установить флаг с помощью <b>/</b><i>pattern</i><b>/</b><i>flags</i> синтаксиса или нечувствительного флага /REGEX/i

( в сторону ) Можем ли мы сделать Regex без учета регистра в HTML5-атрибуте шаблона ? : Нет

Как указывает Крис Р. Тиммонс на RegularExpressionValidator не игнорирует регистр :

В элементе управления RegularExpressionValidator нет свойства, которое позволяет устанавливать параметры регулярных выражений.

Если ваш элемент управления выполняет проверку как на стороне клиента, так и на стороне сервера, регулярное выражение должно использовать подмножество синтаксиса регулярного выражения, что оба JS и .NET могут выполнять . В этом случае, чтобы сделать регулярное выражение игнорировать В этом случае необходимо использовать конструкцию класса символов, например [a-zA-Z] для соответствия как прописным, так и строчным буквам.

Если ваша проверка выполняется только на стороне сервера, вы можете использовать более мощный синтаксис регулярных выражений .NET. В этом случае вы можете поместите опцию (?i) в начале регулярного выражения, чтобы сообщить игнорировать регистр.

Итак, если вы хотите использовать валидатор «из коробки», вы застряли с решением Джеффа о использовании наборов символов, таких как: [aA]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...