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 ответов

Решение
s = s.replaceAll("^/static/\\d{6}-\\d{1,}-.*?/","")

Попробуйте изменить это на это:

/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]*-[0-9]*-.*?/"

Использование:

/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+-[^/]+/"

Пытаться "/static/[0-9]*-[0-9]*-[0-9a-zA-A]*?/" может быть?

Другие вопросы по тегам