У меня странная проблема, которую я не могу решить по какой-то причине. Если у меня есть строка: «аааа аа» И образец такой: «аа». Итак, есть 3 места, которые соответствуют этому шаблону: (aa) (aa) (aa) Я хочу изменить шаблон в определенном месте (скажем, во второй позиции) на что-то еще, скажем, эту строку: «bbb».
Итак, окончательный результат будет: «ааббб аа».
Какой самый простой способ решить эту проблему? Без особого сбора и специальных занятий.
Вам следует предоставить более точные образцы данных. Что произойдет, например, с a aa? Будет ли это a bb или b ba?
На самом деле в "aaaa aa" есть 4 места, соответствующие шаблону "aa".




Один из вариантов - использовать формальный сопоставитель шаблонов регулярных выражений, а затем перебирать входную строку в поисках совпадений aa. Когда мы попадаем в совпадение второй, делаем замену aa на bb, в противном случае просто заменяем исходное значение на aa.
String input = "aaaa aa";
Pattern pattern = Pattern.compile("aa");
Matcher matcher = pattern.matcher(input);
StringBuffer buffer = new StringBuffer();
int num = 0;
while(matcher.find()) {
String replace = num == 1 ? "bbb" : "aa";
matcher.appendReplacement(buffer, replace);
++num;
}
matcher.appendTail(buffer);
System.out.println(buffer.toString());
aabbb aa
Класс String имеет метод indexOf. Этот метод существует в двух вариантах: в первом вы просто указываете иглу (строку, которую хотите искать), а метод возвращает позицию первого символа в стоге сена (строку, которую вы ищете), которая соответствует вашему шаблону.
Второй вариант принимает два параметра: шаблон и позицию, с которой нужно начать.
Итак, вы можете сделать что-то вроде этого:
void replaceSecondOccurrence(String haystack, String needle, String replacement) {
int occurenceToReplace = 2;
int pos = -1;
while (true) {
pos = haystack.indexOf(needle, pos + 1);
if (pos == -1) {
// There is no second occurence. Just return the haystack.
return haystack;
}
if (--occurenceToReplace == 0) return
haystack.substring(0, pos) +
replacement +
haystack.substring(pos + needle.length());
}
}
Я думаю, что есть небольшая проблема с вашим ответом, потому что в aaaa aa второе вхождение на самом деле a'aa'a aa. У вас нет ожидаемого результата. Вы можете проверить это, чтобы проверить: ideone.com/fpT1kx
Это точный образец типа «аа»? Если да, то смотрели ли вы на строковые методы, такие как
indexOf()иsubstring()?