2016-03-27 1 views
1

У меня есть одна строка, в которой мне нужно заменить одно слово другим словом. Вот моя строка clientId как /qw/ty/s11/dc3/124, и у меня есть другая строка id как p13. Я хочу заменить s11 на clientId Строка с p13.как заменить слово после трех слэш другим словом?

Формат clientId будет точно таким же. Значит, будет три slah /, после чего мне нужно заменить это слово другим словом, чтобы любое слово после трех слэшей мне нужно было заменить его значением id.

String clientId = "/qw/ty/s11/dc3/124"; 
String id = "p13"; 
String newId = ""; // this should come as /qw/ty/p13/dc3/124 

Что такое простой способ сделать это?

+0

Я предлагаю использовать [ 'Регулярное Expressions'] (https://docs.oracle.com/javase/tutorial/essential/regex/). –

+0

Можете ли вы привести пример, как я могу использовать 'regex' здесь? – john

+0

Является ли clientId всегда после третьего косая черта? –

ответ

2

Вы можете определенно изменить любую часть строки с помощью регулярного выражения.

Try:

String content = "/qw/ty/xx/dc3/124"; 
String replacement = "replacement"; 

Pattern regex = Pattern.compile("((?:/[^/]+){2}/)([^/]*)(\\S*)", Pattern.MULTILINE); 

Matcher matcher = regex.matcher(content); 
if(matcher.find()){ 
    String result = matcher.replaceFirst("$1" + replacement + "$3"); 
    System.out.println(result); 
} 

на основе входной строки и восстановительной стоимости, она будет излучать:

/qw/ty/replacement/dc3/124 
+0

Как мне изменить регулярное выражение, чтобы получить он работает для строк, таких как content = "/ qw/ty // dc3/124"? – Yev

+0

@ Хороший вопрос и спасибо за просвещение. Я не думал об этой возможности, но ее легко адаптировать. Просто замените '([^ /] +)' на '([^ /] *)', и вам хорошо идти. – Saleem

+0

спасибо, regex, похоже, вещь, с которой каждый программист должен иметь дело :) – Yev

1

Вы можете использовать метод indexOf для поиска второй косой черты. Вы должны сделать это 3 раза. И возвращенная 3 позиция будет той, которую вы хотите. Поскольку вы говорите, что позиция никогда не меняется, это будет сценарий, как это сделать. Другим способом было бы разбить строку на метод split. Тогда вам придется перебирать его и заменять только третье слово. И для каждой итерации вам также нужно будет использовать StringBuilder, чтобы объединить String, чтобы получить путь назад. Эти два подхода не будут использовать значения REGEX. Третий вариант, как и кто-то, предложил бы использовать REGEX.

+0

Можете ли вы привести пример, как я могу использовать 'indexOf' здесь? – john

+0

На мой взгляд, использование 'indexOf' здесь не очень подходит. 'indexOf' возвращает индекс в этой строке первого вхождения указанного символа (а также использует внутренний цикл для доступа к нему). Если позиция 3-го слэша никогда не изменяется, вы всегда знаете позицию (в этом примере это 6). В противном случае использование 3 раза indexOf может выглядеть как 'clientId.indexOf ('/', clientId.indexOf ('/', clientId.indexOf ('/') + 1) +1)' – Yev

0

То, как я это делал, было путем прокрутки первой строки до тех пор, пока не будет найдено 3 косая черта и установка переменной «start» в индекс третьей косой черты. Затем я зациклился от начала до тех пор, пока не будет найден другой косой чертой, и установите переменную с именем «end» в индекс. После этого я использовал метод замены строки, чтобы заменить подстроку с начала + 1 до конца новым идентификатором. Вот код:

String clientId = "/qw/ty/s11/dc3/124"; 
    String id = "p13"; 
    String newId = ""; 
    String temporaryID = clientId; 
    int slashCounter = 0; 
    int start = -1; //Will throw index exception if clientId format is wrong 
    int end = -1; //Will throw index exception if clientId format is wrong 
    for(int i = 0; i < temporaryID.length(); i++){ 
     if(temporaryID.charAt(i)=='/') slashCounter++; 
     if(slashCounter==3){ 
      start = i; 
      break; 
     } 
    } 
    for(int i = start + 1; i < temporaryID.length(); i++){ 
     if(temporaryID.charAt(i)=='/') end = i; 
     if(end!=-1) break; 
    } 
    newId = temporaryID.replace(temporaryID.substring(start+1, end), id); 
    System.out.println(newId); 
0

Попробуйте это, если вам нужно заменить слово между 3-й и 4-й слэш

 int counter = 0; 
     int start=0; 
     int end = clientId.length()-1; 
     for (int i = 0; i < clientId.length(); i++) { 
      if (clientId.charAt(i) == '/') { 
       counter++; 
       if (counter == 3) { 
        start = i+1; // find the index of the char after the 3rd slash 
       } else if (counter == 4) { 
        end = i; // find the index of the 4th slash 
        break; 
       } 
      } 
     } 
     String newId = clientId.substring(0, start) + id + clientId.substring(end); 

Или, если вы хотите заменить все после 3-го слэша:

String newId = clientId.substring(0, start) + id; 
0

Вы можете попробовать это регулярное выражение, чтобы найти строку между третьей и четвертой косой чертой, которая является вашим ID и замените.

Regex:(\/.*?\/.*?\/).*?\/

Regex101 Demo

+0

@david: Saleem опубликовал Java-код, поэтому я не буду его повторять. Надеюсь, вы сможете заставить его работать. –

Смежные вопросы