Регулярное выражение для исключения специальных символов
У меня возникают проблемы с созданием регулярного выражения, которое, по сути, помещает в черный список определенные специальные символы.
Мне нужно использовать это для проверки данных в полях ввода (в веб-приложении Java). Мы хотим, чтобы пользователи могли вводить любую цифру, букву (нам нужно включить акцентированные символы, например, французский или немецкий) и некоторые специальные символы, такие как '-. и т.д.
Как мне занести в черный список символы, такие как & lt;>% $ и т.д.?
Ответы
Ответ 1
Я бы просто белый список символов.
^[a-zA-Z0-9äöüÄÖÜ]*$
Создание черного списка одинаково просто с регулярным выражением, но вам может потребоваться добавить гораздо больше символов - в юникоде есть много китайских символов...;)
^[^<>%$]*$
Выражение [^ (здесь много символов)] просто соответствует любому символу, который не указан.
Ответ 2
Чтобы исключить определенные символы (<, > ,% и $), вы можете сделать регулярное выражение следующим образом:
[<>%\$]
Это регулярное выражение будет соответствовать всем входам, в которых есть черный список. Скобки определяют класс символов, а \- перед знаком доллара, потому что знак доллара имеет особое значение в регулярных выражениях.
Чтобы добавить больше символов в черный список, просто вставьте их между скобками; порядок не имеет значения.
Согласно некоторой документации 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.
}
Ответ 3
Обычно он лучше всего подходит к символам, которые вы разрешаете, а не к черным спискам, которые вы не позволяете. как с точки зрения безопасности, так и с точки зрения простоты внедрения.
Если вы идете по черному списку, вот пример, но будьте осторожны, синтаксис не прост.
http://groups.google.com/group/regex/browse_thread/thread/0795c1b958561a07
Если вы хотите использовать белый список всех символов акцента, возможно, использование диапазонов Unicode поможет? Проверьте эту ссылку.
http://www.regular-expressions.info/unicode.html
Ответ 4
Даже в 2009 году, кажется, слишком многие имели очень ограниченное представление о том, что такое дизайн для всемирной сети. В 2015 году, если не разрабатывать дизайн для конкретной страны, черный список - это единственный способ вместить огромное количество символов, которые могут быть действительными.
Затем необходимо выбрать символы для занесения в черный список в соответствии с тем, что является недопустимым для целей, для которых требуются данные.
Тем не менее, иногда стоит разбить требования и обрабатывать каждый в отдельности. Здесь впереди твой друг. Это разделы, ограниченные (?=)
для положительного и (?!)
для отрицательного, и фактически становятся блоками AND, потому что когда блок обрабатывается, если не выходит из строя, процессор регулярных выражений начинается в начале текста со следующего блока, Фактически, каждому прогнозному блоку будет предшествовать ^
, и, если его шаблон жадный, включите до $
. Даже древний механизм регулярных выражений VB6/VBA (Office) 5.5 поддерживает упреждающий просмотр.
Итак, чтобы создать полное регулярное выражение, начните с упреждающих блоков, затем добавьте блок символов в черный список перед финальным $
.
Например, чтобы ограничить общее количество символов, скажем, от 3 до 15 включительно, начните с блока положительного просмотра (?=^.{3,15}$)
. Обратите внимание, что для этого требовались свои собственные ^
и $
, чтобы он охватывал весь текст.
Теперь, хотя вы, возможно, захотите разрешить _ и -, вы, возможно, не захотите начинать или заканчивать их, поэтому добавьте два отрицательных прогнозных блока, (?!^[_-].+)
для начала и (?!.+[_-]$)
для конца.
Если вам не нужны множественные _
и -
, добавьте отрицательный прогнозный блок (?!.*[_-]{2,})
. Это также исключит последовательности _-
и -_
.
Если больше нет блоков упреждения, добавьте блок черного списка перед $
, например, [^<>[\]{\}|\\\/^~%# :;,$%?\0-\cZ]+
, где \0-\cZ
исключает нулевые и управляющие символы, включая NL (\n
) и CR ([TG419) ]). Окончательный вариант +
гарантирует, что весь текст будет жадно включен.
Внутри домена Unicode могут быть и другие кодовые точки или блоки, которые также должны быть исключены, но, безусловно, намного меньше, чем все блоки, которые должны быть включены в белый список.
Тогда все регулярное выражение всего вышеперечисленного будет
(?=^.{3,15}$)(?!^[_-].+)(?!.+[_-]$)(?!.*[_-]{2,})[^<>[\]{}|\\\/^~%# :;,$%?\0-\cZ]+$
который вы можете проверить в прямом эфире на https://regex101.com/, для двигателей pcre (php), javascript и python regex. Я не знаю, куда вписывается это регулярное выражение java, но вам, возможно, придется изменить это регулярное выражение для удовлетворения его особенностей.
Если вы хотите включить пробелы, но не _
, просто поменяйте их местами в регулярном выражении.
Наиболее полезное применение этого метода - для атрибута pattern
для полей HTML input
, где требуется одно выражение, возвращающее ложное значение в случае сбоя, что делает поле недействительным, позволяя input:invalid
css выделить его, и прекращение подачи формы.
Ответ 5
Я думаю, это зависит от того, на каком языке вы ориентируетесь. В общем, что-то вроде этого должно работать:
[^<>%$]
Конструкция "[]
" определяет класс символов, который будет соответствовать любому из перечисленных символов. Помещение "^
", поскольку первый символ отрицает совпадение, т.е. Любой символ OTHER, чем один из перечисленных.
Вам может понадобиться избежать некоторых символов внутри "[]
", в зависимости от того, какой язык/механизм регулярного выражения вы используете.
Ответ 6
Отрицательный набор всего, что не является буквенно-цифровым & подчеркивание для символов ASCII:
/[^\W]/g
Для проверки электронной почты или имени пользователя я использовал следующее выражение, которое допускает 4 стандартных специальных символа - _. @
/^[[email protected]_a-z0-9]+$/gi
Для строгих буквенно-цифровых выражений используйте:
/^[a-z0-9]+$/gi
Test @RegExr.com
Ответ 7
Вы действительно хотите, чтобы черный список конкретных символов или, скорее, белый список разрешенных символов?
Я предполагаю, что вы действительно хотите последнего. Это довольно просто (добавьте любые дополнительные символы в белый список в группу [\-]
):
^(?:\p{L}\p{M}*|[\-])*$
Изменить: оптимизировал шаблон с помощью ввода комментариев
Ответ 8
Почему вы считаете regex лучшим инструментом для этого? Если ваша цель - определить, присутствует ли незаконченный символ в строке, тестирование каждого символа в цикле будет более простым и эффективным, чем создание регулярного выражения.
Ответ 9
Здесь все французские акцентированные персонажи:
àÀâÂäÄáÁéÉèÈêÊëËìÌîÎïÏòÒôÔöÖùÙûÛüÜçÇñ
Я бы назвал список немецких акцентированных персонажей. Их не так много. Вы должны иметь возможность получить их все.
Для 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());
}
Вероятно, более эффективный способ, заметьте.
Ответ 10
Я сильно подозреваю, что будет проще составить список символов, разрешенных ARE, и тех, которые не являются - и как только у вас есть этот список, синтаксис регулярного выражения становится довольно простым. Поэтому я поставил меня в качестве еще одного голоса за "белый список".
Ответ 11
Используйте этот
^(?=[[email protected]#$^*()_+=[\]{}|\\,.?: -]*$)(?!.*[<>'"/;'%])