Попробуйте:
final String SPACE_PATH_REGEX_EXCLUDE = "[^\\w~/\\-+]";
String out = in.replaceAll(SPACE_PATH_REGEX_EXCLUDE, "_");
Основная проблема, с которой вы столкнулись, заключается в том, что вы добавляете ненужные |
в ваш шаблон. У них другое значение. Кроме того, вы можете значительно упростить выражение, используя \w
, что означает «символ слова», то есть буквы (верхний или нижний регистр), цифры или подчеркивание и является синонимом [A-Za-z0-9_]
.
Также вам необходимо понять, как работает экранирование. Есть экранирование Java-строки, поэтому вы вставляете \\
, чтобы добавить одну обратную косую черту в шаблон. Но есть еще и регулярное выражение. Например, \n
является символом новой строки Java String, а \\n
является последовательностью для помещения \n
в шаблон для поиска символа новой строки.
У вас есть две удобные опции для экранирования текста:
Вы можете использовать \Q...\E
. Все, что находится между \Q
и \E
, экранировано; и
Вы можете использовать Pattern.quote()
для указания произвольной строки.
Где вам нужно экранировать определенные последовательности в регулярных выражениях, контекстуально. Например, -
необходимо экранировать, только если его можно принять за указание диапазона. [a-z]
- символ нижнего регистра. [a\-z]
является одним из a
, -
или z
. Но вы можете сделать -[a-z]
, чтобы указать дефис, за которым следует строчная буква. Примечание: вам не нужно экранировать первый дефис.