2010-10-05 13 views
11

Necesito eliminar todos los caracteres de la cadena dada excepto por los muchos que deberían quedar. ¿Cómo hacer eso con regexp?¿Hay un operador no (!) En regexp?

Prueba simple: los caracteres [1, a, *] no se deben eliminar, todos los demás deben de la secuencia "asdf123 **".

Respuesta

22

Hay:^en un conjunto.

Usted debe ser capaz de hacer algo como:

text = text.replaceAll("[^1a*]", ""); 

muestra completa:

public class Test 
{ 
    public static void main(String[] args) 
    { 
     String input = "asdf123**"; 
     String output = input.replaceAll("[^1a*]", ""); 
     System.out.println(output); // Prints a1** 
    } 
} 
+2

No necesita escapar del '*' en una clase de caracteres. – kennytm

+1

@KennyTM: Ooh, no lo sabía. Saludos, ajustándote ahora ... –

+0

Tampoco necesitas escapar de un guión si está al final o al comienzo de una clase de personaje. Entonces [^ * .-] representa todo lo que no es un asterisco, un punto o un guión. :) –

9

Cuando se usa dentro de [ y ] el ^ (intercalado) es el operador not.

Se utiliza la siguiente manera:

"[^abc]" 

que coincidirá con cualquier carácter excepto por ab o c.

+3

Cuando se usa * como el primer caracter * dentro ... –

1

Hay un character class negado, que podría funcionar para esta instancia. Se define uno poniendo ^ al comienzo de la clase, tales como:

[^1a\*]

para su caso específico.

+0

tienes que escapar del *, debe ser \\ * – Cfreak

+0

En realidad no (en dialectos de expresiones regulares que conozco, de todos modos), pero poder. Aunque agregaré que es explícito. – eldarerathis

+0

@Cfreak: no, no lo hace (ver más arriba) –

0

En una clase de caracteres del^no lo es. Por lo tanto,

[^1a\*] coincidiría con todos los caracteres excepto aquellos.

0

que desea hacer coincidir contra todos los caracteres excepto: [asdf123 *], utilice^

0

No hay operador "not" en expresiones regulares Java como existe en Perl.

+0

¿Estás hablando del operador de coincidencia de expresiones regex invertidas de Perl '! ~'? Eso no es realmente relevante, dado que el OP está haciendo una sustitución, no una coincidencia. Y si * intentaba * emparejar los caracteres en lugar de reemplazarlos, tendría que hacer una coincidencia * positiva * para una expresión regular que excluyera esos caracteres, como señalaron los otros respondedores. Por ejemplo, en Perl podría hacer esto: 'my @result = $ s = ~ m/[^ 1a *] +/g;' –

Cuestiones relacionadas