JAVA: заменить все рег шаблон
Учитывая следующую строку:
String s = "/static/201105-3805-somerandom/images/optional-folder/filename.gif";
Как удалить часть "static/201105-3805-somerandom/"? Часть "201105-3805-somerandom" полностью случайна, но всегда состоит из: - 6 цифр - символа "-" - символов {1, n} цифр - символа "-" - цифры и буквы {1, n} символы
Если я использую "/static/[0-9]*-[0-9]*-*/";
, он заменяет все на последний / вместо того, который стоит сразу после "{1, n} цифр и букв", что мне не хватает?
8 ответов
Попробуйте изменить это на это:
/static/[0-9]*-[0-9]*-.*?/
*
по умолчанию жадный, указав *?
делает это неохотно
Альтернативно, вы также можете сделать это без регулярного выражения, как это:
String s = "/static/201105-3805-somerandom/images/optional-folder/filename.gif";
System.out.println(s.substring(s.indexOf('/', "/static/".length())));
Начнется поиск /
начиная с индекса сразу после статической части. Это выведет:
/images/optional-folder/filename.gif
Использование:
/static/[0-9]{6}-[0-9]*-[a-zA-Z0-9]*//
Ваш последний * перед / просто соответствует всем следующим символам (включая косую черту), поэтому вам нужно быть более конкретным и использовать вместо нас [a-zA-Z0-9].
Кроме регулярных выражений, это будет работать, если "/images..." исправлены:
String given = "/static/201105-3805-somerandom/images/optional-folder/filename.gif";
String replaced = given.substring(given.indexOf("/images"), given.length());
Попробуй это:
String s = "/static/201105-3805-somerandom/images/optional-folder/filename.gif";
String regex = "/static/\\d{6}-\\d{4}-.*?/";
System.out.println(s.replaceAll(regex, "")); // "images/optional-folder/filename.gif"
Вы где используете "жадный" матч .*
, но вам нужен был не жадный матч .*?
Чтобы расширить @ ответ Джона, если String
формат не должен отклоняться от требования OP, где "somerandom" ограничен цифрами и буквами, тогда будет работать следующее регулярное выражение:
"/static/\\d{6}-\\d+-\\p{Alnum}+/"
Это предполагает, что символы US-ASCII. Однако если вам требуется поддержка символов Unicode (см. Общая категория Unicode, раздел 4.5, стр. 126), вы можете использовать следующее регулярное выражение:
"/static/\\d{6}-\\d+-(\\p{Lu}|\\p{Ll}|\\p{Nd})+/"
И если "somerandom" меняется, чтобы быть действительно случайным (исключая /
характер), будет работать следующее:
"/static/\\d{6}-\\d+-[^/]+/"