java - regulares - expresión regular para reemplazar dos(o más) caracteres consecutivos por uno solo?
expresiones regulares solo numeros (8)
en TextEdit (suponiendo expresiones posix) find: [a] + [b] + replace with: ab
En Java, qué expresión regular se puede usar para reemplazar estos, por ejemplo:
antes: aaabbb después: ab
antes: 14442345 después: 142345
¡Gracias!
patrón de coincidencia (en Java / idiomas donde / debe ser escapado):
(.)//1+
o (en idiomas donde puede usar cadenas que no tratan como carácter de escape)
(.)/1+
reemplazo :
$1
originalString.replaceAll( "(.)//1+", "$1" );
"14442345".replaceAll("(.)//1+", "$1");
En perl
s/(.)/1+/$1/g;
El truco, supongo que si Java tiene expresiones regulares compatibles con perl, debería funcionar también.
Editar: Esto es lo que significa
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)
Editar: Como otros han señalado, la sintaxis en Java se convertiría
original.replaceAll("(.)//1+", "$1");
recuerda escaparte del / 1
En Perl:
tr/a-z0-9//s;
Ejemplo:
$ perl -E''@a = (aaabbb, 14442345); for(@a) { tr/a-z0-9//s; say }''
ab
142345
Si Java no tiene tr
analógico, entonces:
s/(.)/1+/$1/sg;
#NOTE: `s` modifier. It takes into account consecutive newlines.
Ejemplo:
$ perl -E''@a = (aaabbb, 14442345); for(@a) { s/(.)/1+/$1/sg; say }''
ab
142345
String a = "aaabbb";
String b = a.replaceAll("(.)//1+", "$1");
System.out.println("''" + a + "'' -> ''" + b + "''");
Azucarado con Java 7: grupos con nombre
static String cleanDuplicates(@NonNull final String val) {
assert val != null;
return val.replaceAll("(?<dup>.)//k<dup>+","${dup}");
}