2009-02-09 35 views
7

¿Cuál es la mejor manera de eliminar todos los caracteres especiales de una cadena - como los siguientes:Eliminando caracteres no numéricos y no alfa de una cadena?

@ # $%^& *() {} |:!?. "> <, /; '[] \ = -

Los artículos que tienen estos personajes retirados haría bastante corto, por lo que sería mejor utilizar Regex en cada o simplemente utilizan la manipulación de cadenas

Thx

Medio Ambiente == C#/.NET

?.

Respuesta

3

en php:

$tests = array(
    'hello, world!' 
    ,'this is a test' 
    ,'and so is this' 
    ,'another test with /slashes/ & (parenthesis)' 
    ,'l3375p34k stinks' 
); 

function strip_non_alphanumerics($subject) 
{ 
    return preg_replace('/[^a-z0-9]/i', '', $subject); 
} 

foreach($tests as $test) 
{ 
    printf("%s\n", strip_non_alphanumerics($test)); 
} 

salida sería:

helloworld 
thisisatest 
andsoisthis 
anothertestwithslashesparenthesis 
l3375p34kstinks 
+0

Podría agregar algunos casos de prueba con letras mayúsculas. –

+0

@jm: eso también es bueno, era demasiado flojo para escribir cualquiera y la "i" que sigue a la expresión regular hace que la expresión regular no distinga entre mayúsculas y minúsculas;) – Kris

+0

P.S. ¿Por qué es esta la respuesta aceptada si la pregunta ahora indica que el entorno es .NET? (No creo que haya sucedido cuando respondí). No sería demasiado diferente conceptualmente en, por ejemplo, C#, pero no se vería así. – Kris

0

Nosotros el comando "tr"?

¿No dices en qué ambiente estás ... concha? Programa C? ¿Java? Cada uno de ellos tendría diferentes mejores soluciones.

6

En general, es mejor tener una lista blanca que una lista negra.

Regex tiene un conveniente \w que, efectivamente, significa caracteres alfanuméricos y guiones bajos (algunas variantes también agregan caracteres acentuados (á, é, ô, etc.) a la lista, otros no).

Puede invertir eso usando \W para indicar todo lo que no sea alfanumérico.

Entonces reemplazar \W con una cadena vacía eliminará todos los caracteres 'especiales'.


Alternativamente, si usted no necesita un conjunto diferente de caracteres a caracteres alfanuméricos, se puede utilizar una clase de caracteres negada: [^abc] coincidirá con todo lo que no es a o b o c, y [^a-z] coincidirá con todo que no está en el rango a,b,c,d...x,y,z

el equivalente a \w es [A-Za-z0-9_] y por lo tanto \W es [^A-Za-z0-9_]

0

¿En qué idioma se dirige la expresión regular?

Por ejemplo, en Perl se puede hacer una traducción que se traduciría cualquiera de los caracteres en la lista en la nada:

por ejemplo, Esto se traducirá 'a', 'b', 'c' o 'd' en ''

$sentence =~ tr/abcd//; 
2

prefiero expresiones regulares porque la sintaxis es más fácil de leer y mantener:

# in Python 
import re 
re.sub("[abcdef]", "", text) 

donde abcdef son correctamente escapó caracteres que se eliminarán.

Alternativamente, si desea que sólo caracteres alfanuméricos (más el guión bajo), se puede utilizar:

re.sub("\W", "", text) 

donde \W representa un personaje no-palabra, es decir [^a-zA-Z_0-9].

1

Cuando sólo quieren tener caracteres alfanuméricos, que sólo podría expresar esto mediante el uso de una clase de caracteres invertida:

[^A-Za-z0-9]+ 

Esto significa: cada carácter que no es alfanumérico.

+0

no del todo, se le olvidó A-Z :) Creo – Robert

+0

Esto se puede simplificar a \ w – UnkwnTech

+0

\ w gradas de [A-Za-z0-9_] y no estoy seguro de si lo que quiere es la línea de baja también. – Gumbo

1

aquí es una expresión regular sencilla

[^\w] 

esto debe coger todos los caracteres que no son de texto Esto permitirá az AZ 0 -9 espacio y _ ni espacio ni _ estaban en tu lista, así que esto funciona si quisieras atraparlos también entonces yo haría algo ng como esto:

/[a-z0-90/i 

este es el formato PHP para a-z y 0-9 el i hace que sea sensible a las mayúsculas.

+0

Esto está mal. \ w * no * incluye espacio. También es demasiado complejo hacer "[^ \ w]" en lugar de solo "\ W". Y su segunda expresión no funcionará: tiene un cero en lugar del corchete de cierre. Este tampoco es un formato específico de PHP, funciona para muchas formas diferentes. –

0

Puede validarlos en la interfaz obteniendo los valores askey de los caracteres introducidos.

0

El enfoque ideal en PHP sería ...

$text = "ABCDEF...Á123"; 
$text = preg_replace('/[^\p{L}]/i', '', $text); 
print($text); # Output: ABCDEFÁ 

O, en Perl ...

my $text = "ABCDEF...Á123"; 
$text =~ s/[^\p{L}]//gi; 
print($text); # Output: ABCDEFÁ 

Si simplemente asemeja a [^ a-zA-Z], se Extrañaremos todos los caracteres acentuados, que (en su mayor parte), me imagino que te gustaría retener.

Cuestiones relacionadas