null

\p{C}: как охватить все служебные символы одним регулярным выражением

Не так давно, разрабатывая поток обработки данных в Apache NiFi, мы столкнулись с необходимостью очистки результата конвертации в base64 от всех служебных символов, переносов строк и прочих "невидимых" символов, которые, однако, мешали целевому сервису принять наши данные в теле POST-запроса. Нам на помощь пришло Unicode-based регулярное выражение \p{C}. Мы смогли добиться  желаемого результата, просто найдя по этому регулярному выражению все ненужные фрагменты и заменив их на пустую строку:

Данное решение мы нашли здесь и оно оказалось рабочим. Разбираясь подробнее, оказалось, что суть данной замены в специфике Unicode categories. Каждый символ Юникода принадлежит к определенной категории символов. Например, единичный символ, относящийся к категории "буква", может быть определен выражением \p{L}. Для определения символов, которые не входят в указанную категорию, можно соответственно использовать \P{L}

\p{C} или же \p{Other} используются для выбора непечатных служебных символов. Здесь же есть и более конкретные подкатегории для более гибкого выбора необходимых групп символов в регулярном выражении (например выбора только символов форматирования текста). Их список следующий:

  • \p{Cc} or \p{Control}: an ASCII or Latin-1 control character: 0x00–0x1F and 0x7F–0x9F
  • \p{Cf} or \p{Format}: invisible formatting indicator
  • \p{Co} or \p{Private_Use}: any code point reserved for private use
  • \p{Cs} or \p{Surrogate}: one half of a surrogate pair in UTF-16 encoding
  • \p{Cn} or \p{Unassigned}: any code point to which no character has been assigned

По ссылке выше также представлены и другие категории символов Unicode, с которыми можно ознакомиться выше.

Таким образом, Unicode-based regex могут помочь эффективно и единообразно указать в регулярном выражении целую группу символов. В частности выражение \p{C} вмещает в себя наиболее полный набор служебных и непечатных символов, позволяя взять "всё и сразу". Unicode regexp поддерживаются во многих языках программирования и могут быть использованы в проектах самого разного профиля, а не только в Apache NiFi, как в примере в начале.

Вперед

Коротко о себе:

 

Работаю Java\Kotlin Backend Developer в компании Tune-it. На работе занимаюсь проектами, связанными с Liferay, NiFi, Spring Framework, а вне работы - философской антропологией