Найдите шаблон в определенном месте в строке и замените его чем-то другим в Java

У меня странная проблема, которую я не могу решить по какой-то причине. Если у меня есть строка: «аааа аа» И образец такой: «аа». Итак, есть 3 места, которые соответствуют этому шаблону: (aa) (aa) (aa) Я хочу изменить шаблон в определенном месте (скажем, во второй позиции) на что-то еще, скажем, эту строку: «bbb».

Итак, окончательный результат будет: «ааббб аа».

Какой самый простой способ решить эту проблему? Без особого сбора и специальных занятий.

Это точный образец типа «аа»? Если да, то смотрели ли вы на строковые методы, такие как indexOf() и substring()?

Thomas 29.11.2018 11:07

Вам следует предоставить более точные образцы данных. Что произойдет, например, с a aa? Будет ли это a bb или b ba?

Tim Biegeleisen 29.11.2018 11:08

На самом деле в "aaaa aa" есть 4 места, соответствующие шаблону "aa".

Meini 29.11.2018 11:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
3
133
2

Ответы 2

Один из вариантов - использовать формальный сопоставитель шаблонов регулярных выражений, а затем перебирать входную строку в поисках совпадений 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

Mickael 29.11.2018 11:26

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