Регулярное выражение для замены двух (или более) последовательных символов только одним?
В 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}");
}