validar solo regulares regular que numeros mayores letras expresiones expresion espacios espacio ejemplos consecutivos blanco alfanumerico java regex

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}"); }