JAVA: заменить все рег шаблон - PullRequest
2 голосов
/ 01 июля 2011

Учитывая следующую строку:

String s = "/static/201105-3805-somerandom/images/optional-folder/filename.gif";

Как удалить часть «static / 201105-3805-somerandom /»?Часть "201105-3805-somerandom" полностью случайна, но всегда состоит из: - 6 цифр - символа "-" - символов {1, n} цифр - символа "-" - цифры и буквы {1, n}chars

Если я использую "/static/[0-9]*-[0-9]*-*/";, он заменяет все на последний / вместо того, который стоит сразу после "{1, n} цифр и букв", что мне не хватает?

Ответы [ 8 ]

4 голосов
/ 01 июля 2011

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

/static/[0-9]*-[0-9]*-.*?/

* по умолчанию является жадным, указав *?, делает его неохотным.

Alternativaly, вы также можете сделать это без регулярного выражения, как это:

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
2 голосов
/ 01 июля 2011

Вам нужен не жадный *:

"/static/[0-9]*-[0-9]*-.*?/"
1 голос
/ 01 июля 2011
s = s.replaceAll("^/static/\\d{6}-\\d{1,}-.*?/","")
0 голосов
/ 01 июля 2011

Если продолжить ответ @ Джона, если формат 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+-[^/]+/"
0 голосов
/ 01 июля 2011

Кроме регулярных выражений, это будет работать, если фиксированы "/ images ...":

String given = "/static/201105-3805-somerandom/images/optional-folder/filename.gif";
String replaced = given.substring(given.indexOf("/images"), given.length());
0 голосов
/ 01 июля 2011

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

/static/[0-9]{6}-[0-9]*-[a-zA-Z0-9]*//

Ваш последний * перед / просто соответствует всем следующим символам (включая косую черту), поэтому вам нужно быть более конкретным и использовать вместо нас [a-zA-Z0-9].

0 голосов
/ 01 июля 2011

Попробуйте "/static/[0-9]*-[0-9]*-[0-9a-zA-A]*?/" возможно?

0 голосов
/ 01 июля 2011

Попробуйте это:

    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"

Вы использовали «жадное» совпадение .*, но вам нужно было не жадное совпадение .*?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...