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

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

до: aaabbb после: аб

before: 14442345 after: 142345

Спасибо!

Ответы на вопрос(8)

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

(.

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

(.)\1+ 

replacement:

$1

В 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 
originalString.replaceAll( "(.)\\1+", "$1" );

static String cleanDuplicates(@NonNull final String val) { 
      assert val != null;
      return val.replaceAll("(?<dup>.)\\k<dup>+","${dup}");
}
Решение Вопроса

В перл

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

 21 окт. 2015 г., 14:48
Квантификаторы Java немного отличаются:docs.oracle.com/javase/tutorial/essential/regex/quant.html , Я предполагаю original.replaceAll (& quot; (.) {2,} & quot ;, & quot; $ 1 & quot;); должен сделать работу (пример работал для 2 и более, но не если я хотел заменить три и более вхождений)

найти: [a] + [b] + заменить на: ab

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

Ваш ответ на вопрос