Я бы использовал следующее:
[\]!"%&'()*+,:;<=>?@[\\^_`{|}~-]|\.(?![a-zA-Z0-9])
Класс символов [!"%&'()*+,:;<=>?@[\]^_`{|}~-]
соответствует любому символу \p{P}
, за исключением /
, #
, $
и .
, а также другая альтернатива соответствует точке, за которой не следует ни буквы, ни ди git.
Обратите внимание, что заманчиво использовать \b
, но это плохая идея, поскольку \w
включает в себя _
в дополнение на [a-zA-Z0-9]
.
Если вы хотите продолжать использовать \p{P}
, вы можете использовать следующее, но ожидать меньших результатов:
(?![/#$]|\.[a-zA-Z0-9])\p{P}
Следующее также будет работать и может быть эффективен как мой первый ответ, но он основан на менее известном синтаксисе, который, если я не ошибаюсь, задает от c до Java регулярных выражений:
[\p{P}&&[^/#$.]]|\.(?![a-zA-Z0-9])