333 votes

Enlevez pas les caractères alphanumériques de la chaîne. La difficulté avec le [\] caractère

Je veux convertir la chaîne suivante à la sortie.

Input:  "\\test\red\bob\fred\new"
Output: "testredbobfrednew"

Je n'ai pas trouvé de solution qui permettra de gérer les caractères spéciaux comme \r, \n, \b, etc.

Fondamentalement, je veux juste de se débarrasser de tout ce qui n'est pas alphanumérique. Voici ce que j'ai essayé...

Attempt 1: "\\test\red\bob\fred\new".replace(/[_\W]+/g, "");
Output 1:  "testedobredew"

Attempt 2: "\\test\red\bob\fred\new".replace(/['`~!@#$%^&*()_|+-=?;:'",.<>\{\}\[\]\\\/]/gi, "");
Output 2:  "testedobred [newline] ew"

Attempt 3: "\\test\red\bob\fred\new".replace(/[^a-zA-Z0-9]/, "");
Output 3:  "testedobred [newline] ew"

Attempt 4: "\\test\red\bob\fred\new".replace(/[^a-z0-9\s]/gi, '');
Output 4:  "testedobred [newline] ew"

Une autre tentative avec plusieurs étapes

function cleanID(id) {
    id = id.toUpperCase();
    id = id.replace( /\t/ , "T");
    id = id.replace( /\n/ , "N");
    id = id.replace( /\r/ , "R");
    id = id.replace( /\b/ , "B");
    id = id.replace( /\f/ , "F");
    return id.replace( /[^a-zA-Z0-9]/ , "");
}

avec les résultats

Attempt 1: cleanID("\\test\red\bob\fred\new");
Output 1: "BTESTREDOBFREDNEW"

Toute aide serait appréciée.

Solution De Travail:

Final Attempt 1: return JSON.stringify("\\test\red\bob\fred\new").replace( /\W/g , '');
Output 1: "testredbobfrednew"

634voto

AD7six Points 22679

Suppression de non-alphanumériques caractères

Ce qui suit est l ' /une bonne regex à la bande de non-alphanumériques caractères d'une chaîne d'entrée:

input.replace(/\W/g, '')

L'entrée est incorrect

Depuis la chaîne de test contient divers échappé caractères, qui ne sont pas alphanumérique, il va les supprimer.

Une barre oblique inverse dans la chaîne a besoin de s'échapper si c'est pour être pris à la lettre:

"\\test\\red\\bob\\fred\\new".replace(/\W/g, '')
"testredbobfrednew" // output

La manipulation de chaînes de caractères mal formés

Si vous n'êtes pas en mesure d'échapper à la chaîne d'entrée correctement (pourquoi pas?), ou ça vient d'une sorte de non approuvé/mal à la source, vous pouvez faire quelque chose comme ceci:

JSON.stringify("\\test\red\bob\fred\new").replace(/\W/g, '')
"testredbobfrednew" // output

Notez que la représentation json d'une chaîne comprend les citations:

JSON.stringify("\\test\red\bob\fred\new")
""\\test\red\bob\fred\new""

Mais ils sont aussi supprimés par le remplacement de la regex.

11voto

Guffa Points 308133

Le problème n'est pas comment vous de remplacer les caractères, le problème est la façon dont vous l'entrée de la chaîne.

C'est seulement la première barre oblique inverse dans l'entrée qui est un caractère barre oblique inverse, les autres sont en partie les caractères de contrôle, \r, \b, \f et \n.

Comme ces barres obliques inverses ne sont pas des personnages, mais une partie de la notation à écrire un seul des caractères de contrôle, ils ne peuvent pas être éliminés séparément. I. e. vous ne pouvez pas supprimer la barre oblique inverse à partir d' \n que ce n'est pas deux caractères distincts, c'est la façon dont vous écrivez le caractère de contrôle LF, ou saut de ligne.

Si vous acutally voulez transformer cette entrée en sortie désirée, vous devez remplacer chaque caractère de contrôle avec la lettre correspondante, par exemple, remplacer le caractère \n avec le caractère n.

Pour remplacer un caractère de contrôle, vous devez utiliser un jeu de caractères comme [\r], \r a une signification particulière dans une expression régulière:

var input = "\\test\red\bob\fred\new";

var output = input
    .replace(/[\r]/g, 'r')
    .replace(/[\b]/g, 'b')
    .replace(/[\f]/g, 'f')
    .replace(/[\n]/g, 'n')
    .replace(/\\/g, '');

Démo: http://jsfiddle.net/SAp4W/

-3voto

shift66 Points 4964

Si vous voulez avoir cette \\test\red\bob\fred\new chaîne de caractères, vous devez échapper à toutes les barres obliques inverses (\). Lorsque vous écrivez \\test\\red\\bob\\fred\\new votre chaîne contient en fait seul inverses. Vous pouvez être sûr de cette impression de votre chaîne.
Donc, si les barres obliques inverses dans votre chaîne d'échapper myString.replace(/\W/g,'') fonctionnera normalement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X