Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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]#$^*()_+=[\]{}|\\,.?: -]*$)(?!.*[<>'"/;'%])