Регулярное выражение для замены двух (или более) последовательных символов только одним?

В java, регулярное выражение которого может быть использовано для их замены, например:

перед: aaabbb после: AB

перед: 14442345 после: 142345

спасибо!

Ответы

Ответ 1

В perl

s/(.)\1+/$1/g;

Есть ли трюк, я предполагаю, что если java имеет perl-совместимые регулярные выражения, он тоже должен работать.

Изменить: вот что означает

s {
    (.)  # match any charater ( and capture it )
    \1   # if it is followed by itself 
    +    # One or more times
}{$1}gx;  # And replace the whole things by the first captured character (with g modifier to replace all occurences)

Изменить: как указывали другие, синтаксис в Java станет

original.replaceAll("(.)\\1+", "$1");

помните, чтобы избежать\1

Ответ 2

String a = "aaabbb";
String b = a.replaceAll("(.)\\1+", "$1");
System.out.println("'" + a + "' -> '" + b + "'");

Ответ 3

"14442345".replaceAll("(.)\\1+", "$1");

Ответ 4

originalString.replaceAll( "(.)\\1+", "$1" );

Ответ 5

шаблон соответствия (в Java/языках, где\должно быть экранировано):

(.)\\1+

или (на языках, где вы можете использовать строки, которые не обрабатывают\как escape-символ)

(.)\1+ 

замена:

$1

Ответ 6

в TextEdit (при условии выражения posix) find: [a] + [b] + замените на: ab

Ответ 7

В Perl:

tr/a-z0-9//s;

Пример:

$ perl -E'@a = (aaabbb, 14442345); for(@a) { tr/a-z0-9//s; say }'
ab
142345 

Если Java не имеет аналога tr, тогда:

s/(.)\1+/$1/sg; 
#NOTE: `s` modifier. It takes into account consecutive newlines.

Пример:

$ perl -E'@a = (aaabbb, 14442345); for(@a) { s/(.)\1+/$1/sg; say }'
ab
142345 

Ответ 8

Sugared с Java 7: Именованные группы

static String cleanDuplicates(@NonNull final String val) { 
      assert val != null;
      return val.replaceAll("(?<dup>.)\\k<dup>+","${dup}");
}