Регулярное выражение для исключения специальных символов - PullRequest
30 голосов
/ 16 апреля 2009

У меня проблемы с созданием регулярного выражения, которое, по сути, помещает в черный список определенные специальные символы.

Мне нужно использовать это для проверки данных в полях ввода (в веб-приложении Java). Мы хотим, чтобы пользователи могли вводить любую цифру, букву (нам нужно включить акцентированные символы, например французский или немецкий) и некоторые специальные символы, такие как '-. и т.д.

Как мне занести в черный список такие символы, как <>% $ и т. Д.?

Любая помощь будет принята с благодарностью.

Ответы [ 11 ]

36 голосов
/ 16 апреля 2009

Я бы просто перечислил белый список символов.

^[a-zA-Z0-9äöüÄÖÜ]*$

Создать черный список с помощью регулярных выражений также просто, но вам может понадобиться добавить гораздо больше символов - в юникоде много китайских символов ...;)

^[^<>%$]*$

Выражение [^ (здесь много символов)] просто соответствует любому символу, которого нет в списке.

8 голосов
/ 16 апреля 2009

Чтобы исключить определенные символы (<,>,% и $), вы можете создать регулярное выражение, например:

[<>%\$]

Это регулярное выражение будет соответствовать всем входным данным, в которых есть черный список символов. Скобки определяют класс символов, и перед знаком доллара необходимо указывать \, потому что в регулярных выражениях знак доллара имеет особое значение.

Чтобы добавить больше символов в черный список, просто вставьте их в скобки; заказ не имеет значения.

Согласно некоторой документации Java для регулярных выражений , вы можете использовать выражение как это:

Pattern p = Pattern.compile("[<>%\$]");
Matcher m = p.matcher(unsafeInputString);
if (m.matches())
{
    // Invalid input: reject it, or remove/change the offending characters.
}
else
{
    // Valid input.
}
5 голосов
/ 16 апреля 2009

Обычно лучше разрешить белый список символов, которые вы разрешаете, чем черный список символов, которые вы не разрешаете. как с точки зрения безопасности, так и с точки зрения простоты реализации.

Если вы идете по маршруту черного списка, вот пример, но будьте осторожны, синтаксис не прост.

http://groups.google.com/group/regex/browse_thread/thread/0795c1b958561a07

Если вы хотите внести в белый список все символы акцента, возможно, поможет использование диапазонов Юникода? Проверьте эту ссылку.

http://www.regular -expressions.info / unicode.html

4 голосов
/ 16 апреля 2009

Я думаю, это зависит от того, на какой язык вы ориентируетесь. В общем, как-то так должно работать:

[^<>%$]

Конструкция "[]" определяет класс символов, который будет соответствовать любому из перечисленных символов. Помещение «^» в качестве первого символа отменяет совпадение, т. Е. Любой символ ДРУГОЙ, чем один из перечисленных.

Вам может потребоваться экранировать некоторые символы в пределах "[]", в зависимости от того, какой язык / движок регулярных выражений вы используете.

3 голосов
/ 24 января 2018

Отрицательный набор всего, что не является буквенно-цифровым и подчеркиванием для символов ASCII:

/[^\W]/g

Для проверки электронной почты или имени пользователя я использовал следующее выражение, которое допускает 4 стандартных специальных символа - _. @

/^[-.@_a-z0-9]+$/gi

Для строгих буквенно-цифровых выражений используйте:

/^[a-z0-9]+$/gi

Тест @ RegExr.com

3 голосов
/ 28 ноября 2015

Даже в 2009 году, кажется, слишком многие имели очень ограниченное представление о том, что такое дизайн для всемирной сети. В 2015 году, если не разрабатывать дизайн для конкретной страны, черный список - это единственный способ вместить огромное количество символов, которые могут быть действительными.

Затем необходимо выбрать символы для занесения в черный список в соответствии с тем, что является недопустимым для целей, для которых требуются данные.

Однако иногда бывает полезно разбить требования и обращаться с каждым в отдельности. Здесь впереди твой друг. Это разделы, ограниченные (?=) для положительного и (?!) для отрицательного, и фактически становятся блоками AND, потому что когда блок обрабатывается, если не выходит из строя, процессор regex начинает в начале текста следующий блок , Фактически, каждому блоку прогнозирования будет предшествовать ^, а если его шаблон жадный, включать до $. Даже древний механизм регулярных выражений VB6 / VBA (Office) 5.5 поддерживает прогнозирование.

Итак, чтобы создать полное регулярное выражение, начните с упреждающих блоков, затем добавьте блок символов в черный список перед последним $.

Например, чтобы ограничить общее количество символов, скажем, от 3 до 15 включительно, начните с блока положительного просмотра (?=^.{3,15}$). Обратите внимание, что для этого требовались собственные ^ и $, чтобы он охватывал весь текст.

Теперь, хотя вы, возможно, захотите разрешить _ и -, вы, возможно, не захотите начинать или заканчивать их, поэтому добавьте два отрицательных прогнозных блока, (?![_-].+) для начала и (?!.+[_-]$) для конца.

Если вам не нужны множественные _ и -, добавьте отрицательный прогнозный блок (?!.*[_-]{2,}). Это также исключит последовательности _- и -_.

Если больше нет блоков предварительного просмотра, то добавьте блок черного списка перед $, например [^<>[\]{\}|\\\/^~%# :;,$%?\0-\cZ]+, где \0-\cZ исключает нулевые и управляющие символы, включая NL (\n) и CR (\r). Окончательный + гарантирует, что весь текст будет жадно включен.

В домене Unicode вполне могут быть и другие кодовые точки или блоки, которые также должны быть исключены, но, безусловно, намного меньше, чем все блоки, которые должны быть включены в белый список.

Тогда все регулярное выражение всего вышеперечисленного будет

(?=^.{3,15}$)(?![_-].+)(?!.+[_-]$)(?!.*[_-]{2,})[^<>[\]{}|\\\/^~%# :;,$%?\0-\cZ]+$

, который вы можете проверить вживую на https://regex101.com/, для pcre (php), javascript и python regex engine. Я не знаю, куда вписывается это регулярное выражение java, но вам, возможно, придется изменить это регулярное выражение для удовлетворения его особенностей.

Если вы хотите включить пробелы, но не _, просто поменяйте их местами в регулярном выражении.

Наиболее полезное применение для этого метода - для атрибута pattern для полей HTML input, где требуется одно выражение, возвращающее ложное значение в случае сбоя, что делает поле недействительным, что позволяет input:invalid css выделить это, и прекращение подачи формы.

2 голосов
/ 16 апреля 2009

Вы действительно хотите занести в черный список определенные символы или, вернее, внести в белый список разрешенные символы?

Я предполагаю, что вы действительно хотите последнее. Это довольно просто (добавьте любые дополнительные символы в белый список в группу [\-]):

^(?:\p{L}\p{M}*|[\-])*$

Редактировать: Оптимизирован шаблон с учетом комментариев

1 голос
/ 30 сентября 2009

Вот все французские акцентированные символы: àÀâÂäÄáÁéÉèÈêÊëËìÌîÎïÏòÒôÔöÖùÙûÛüÜçÇ'ñ

Я бы посмотрел список символов с немецким акцентом. Таких не много. Вы должны быть в состоянии получить их всех.

Для URL-адресов я заменяю акцентированные URL-адреса обычными буквами, например:

string beforeConversion = "àÀâÂäÄáÁéÉèÈêÊëËìÌîÎïÏòÒôÔöÖùÙûÛüÜçÇ’ñ";
string afterConversion = "aAaAaAaAeEeEeEeEiIiIiIoOoOoOuUuUuUcC'n";
for (int i = 0; i < beforeConversion.Length; i++) {

     cleaned = Regex.Replace(cleaned, beforeConversion[i].ToString(), afterConversion[i].ToString());
}

Возможно, есть более эффективный способ.

1 голос
/ 16 апреля 2009

Почему вы считаете регулярное выражение лучшим инструментом для этого? Если ваша цель - определить, присутствует ли в строке недопустимый символ, тестирование каждого символа в цикле будет проще и эффективнее, чем создание регулярного выражения.

0 голосов
/ 12 сентября 2017

Используйте это

^ (? = [A-zA-Z0-9 ~ @ # $ ^ () _ + = [] {} | \,.?: -] $) (?!. * [<> ' "/;`%])

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