Регулярное выражение для замены повторяющегося строкового шаблона

2

Мне нужно заменить повторяющийся шаблон в слове с каждым базовым элементом конструкции. Например У меня есть строка "TATATATA", и я хочу заменить ее "TA". Кроме того, я бы, вероятно, заменил более 2 повторений, чтобы избежать замены обычных слов.

Я пытаюсь сделать это на Java с помощью метода replaceAll.

  • 3
    Где твой код / регулярное выражение?
  • 0
    Если вы уже используете replaceAll (), в чем проблема? replaceAll делает именно то, что вы хотите сделать (если у вас есть простой шаблон, как описано выше).
Показать ещё 11 комментариев
Теги:
string
pattern-matching
replaceall

3 ответа

6
Лучший ответ

Я думаю, что вам нужно это (работает для любой длины повторяющейся строки):

String result = source.replaceAll("(.+)\\1+", "$1")

Или, альтернативно, для определения более коротких совпадений:

String result = source.replaceAll("(.+?)\\1+", "$1")

Он сначала совпадает с группой букв, а затем снова (используя обратную ссылку в шаблоне соответствия). Я попробовал это и, похоже, сделал трюк.


Пример

String source = "HEY HEY duuuuuuude what'' up? Trololololo yeye .0.0.0";

System.out.println(source.replaceAll("(.+?)\\1+", "$1"));

// HEY dude what up? Trolo ye .0
1

Вам лучше использовать Pattern здесь, чем .replaceAll(). Например:

private static final Pattern PATTERN 
    = Pattern.compile("\\b([A-Z]{2,}?)\\1+\\b");

//...

final Matcher m = PATTERN.matcher(input);
ret = m.replaceAll("$1");

edit: example:

public static void main(final String... args)
{
    System.out.println("TATATA GHRGHRGHRGHR"
        .replaceAll("\\b([A-Za-z]{2,}?)\\1+\\b", "$1"));
}

Отпечатки:

TA GHR
  • 0
    Не работает, печатает всю строку. Спасибо за Ваш ответ!
  • 0
    У меня работает ... покажи код и входы
Показать ещё 1 комментарий
1

Поскольку вы запросили решение для регулярного выражения:

(\\w)(\\w)(\\1\\2){2,};

(\w)(\w): соответствует каждой паре последовательных словных символов ((.)(.) будет захватывать каждую пару символов любого типа), сохраняя их в группы захвата 1 и 2. (\\1\\2) соответствует в любое время, когда символы в этих группах снова повторяются сразу же после этого, и {2,} соответствует, когда он повторяется два или более раз ({2,10} будет соответствовать, когда он повторяет более одного, чем десять раз).

String s = "hello TATATATA world";    
Pattern p = Pattern.compile("(\\w)(\\w)(\\1\\2){2,}");
Matcher m = p.matcher(s);
while (m.find()) System.out.println(m.group());
    //prints "TATATATA"
  • 0
    Я боюсь, что печатает только первое письмо. Спасибо за Ваш ответ!
  • 0
    @ddmichael смотри править :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню