2009-02-09 10 views
7

Quelle est la meilleure façon de supprimer tous les caractères spéciaux d'une chaîne - comme ceux-ci:Suppression de caractères non numériques et non alpha d'une chaîne?

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

Les éléments ayant ces caractères supprimés serait assez court, donc serait-il préférable d'utiliser REGEX sur chaque ou tout simplement utiliser la manipulation de chaînes

Thx

Environnement == C#/NET

?.

Répondre

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

sortie serait:

helloworld 
thisisatest 
andsoisthis 
anothertestwithslashesparenthesis 
l3375p34kstinks 
+0

Je pourrais ajouter quelques cas de test avec des majuscules. –

+0

@jm: c'est une bonne chose aussi, j'étais juste trop paresseux pour taper any et le "i" qui suit la regex rend la regex insensible à la casse;) – Kris

+0

P.S. Pourquoi est-ce la réponse acceptée si la question dit maintenant que l'environnement est .NET? (Je ne pense pas que c'était le cas quand j'ai répondu). Ce ne serait pas trop différent sur le plan conceptuel, par exemple en C#, mais cela ne ressemblerait en rien à cela. – Kris

0

Nous la commande "tr"?

Vous ne dites pas dans quel environnement vous êtes ... shell? Programme C? Java? Chacun d'entre eux aurait différentes meilleures solutions.

6

Il est généralement préférable d'avoir une liste blanche plutôt qu'une liste noire.

Regex a un \w pratique qui, en fait, signifie alphanumérique plus souligné (certaines variantes ajoutent également des caractères accentués (á, é, ô, etc.) à la liste, d'autres non).

Vous pouvez inverser cela en utilisant \W pour désigner tout ce qui n'est pas alphanumérique.

Donc remplacez \W par une chaîne vide pour supprimer tous les caractères spéciaux.


Sinon, si vous avez besoin d'un ensemble de caractères différent alphanumériques, vous pouvez utiliser une classe de caractères niée: [^abc] va correspondre à tout qui ne a ou b ou c et [^a-z] va correspondre à tout qui ne figure pas dans la gamme a,b,c,d...x,y,z

l'équivalent de \w est [A-Za-z0-9_] et donc \W

est [^A-Za-z0-9_]
0

Dans quelle langue allez-vous regex?

Par exemple, en Perl, vous pouvez faire une traduction qui se traduirait par l'un des caractères dans la liste en rien:

par exemple Cela se traduira par 'a', 'b', 'c' ou 'd' en ''

$sentence =~ tr/abcd//; 
2

Je préfère regex car la syntaxe est plus simple à lire et à maintenir:

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

abcdef sont correctement échappé caractères à être supprimés.

Sinon, si vous voulez que des caractères alphanumériques (plus le trait de soulignement), vous pouvez utiliser:

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

\W représente un caractère non-mot, à savoir [^a-zA-Z_0-9].

1

Lorsque vous voulez juste avoir des caractères alphanumériques, vous pouvez simplement exprimer en utilisant une classe de caractère inversé:

[^A-Za-z0-9]+ 

Cela signifie: chaque caractère non alphanumérique.

+0

pas tout à fait, vous avez oublié A-Z je pense :) – Robert

+0

Cela peut être simplifié à \ w – UnkwnTech

+0

\ w est synonyme de [A-Za-z0-9_] et je ne suis pas sûr s'il veut la ligne basse aussi bien. – Gumbo

1

est ici simple regex

[^\w] 

cela devrait attraper tous les caractères non-mot, cela permettra az AZ 0 -9 espace et _ ni espace ni _ étaient dans votre liste donc cela fonctionne si vous vouliez les attraper aussi alors je ferais quelque chose ng comme ceci:

/[a-z0-90/i 

c'est le format de PHP pour a-z et 0-9 le i le rend insensible à la casse.

+0

C'est faux. \ w n'inclut * pas * d'espace. Il est également trop complexe de faire "[^ \ w]" au lieu de simplement "\ W". Et votre deuxième expression ne fonctionnera pas - elle a un zéro à la place de la parenthèse fermante. Ce n'est pas non plus un format spécifique à PHP, cela fonctionne pour de nombreuses formes différentes. –

0

Vous pouvez plutôt les valider au frontend en obtenant les valeurs askey des caractères saisis.

0

L'approche idéale en PHP serait ...

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

Ou, en Perl ...

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

Si vous correspondez simplement sur [^ a-zA-Z], vous va manquer tous les caractères accentués, qui (pour la plupart), j'imagine que vous voudriez retenir.

Questions connexes