Мне нужно заменить повторяющийся шаблон в слове с каждым базовым элементом конструкции. Например У меня есть строка "TATATATA", и я хочу заменить ее "TA". Кроме того, я бы, вероятно, заменил более 2 повторений, чтобы избежать замены обычных слов.
Я пытаюсь сделать это на Java с помощью метода replaceAll.
Я думаю, что вам нужно это (работает для любой длины повторяющейся строки):
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
Вам лучше использовать 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
Поскольку вы запросили решение для регулярного выражения:
(\\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"