Даже в 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 выделить это, и прекращение подачи формы.