web-dev-qa-db-fra.com

Supprimez les caractères non alphanumériques de la chaîne. Avoir des problèmes avec le caractère [\]

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

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

Je n'ai trouvé aucune solution permettant de gérer des caractères spéciaux tels que \r, \n, \b, etc.

En gros, je veux juste me 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 en 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 des 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"
170
Bobby Cannon

Suppression des caractères non alphanumériques

Ce qui suit est le/un regex correct pour éliminer les caractères non alphanumériques d'une chaîne d'entrée:

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

Notez que \W est l'équivalent de [^0-9a-zA-Z_] - il comprend le caractère de soulignement. Pour supprimer également les traits de soulignement, utilisez par exemple:

input.replace(/[^0-9a-z]/gi, '')

L'entrée est mal formée

Puisque la chaîne de test contient divers caractères d'échappement, qui ne sont pas alphanumériques, elle les supprimera.

Une barre oblique inversée dans la chaîne doit être évitée si elle doit être prise à la lettre:

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

Manipulation de chaînes malformées

Si vous ne pouvez pas échapper correctement la chaîne d'entrée (pourquoi pas?), Ou si elle provient d'une source non fiable/mal configurée, 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 inclut les guillemets:

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

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

364
AD7six

Toutes les réponses actuelles ont encore des problèmes, la meilleure chose que j'ai pu trouver était:

string.replace(/[^A-Za-z0-9]/g, '');

Voici un exemple qui capture toutes les touches que je pourrais trouver sur le clavier:

var string = '123abcABC-_*(!@#$%^&*()_-={}[]:\"<>,.?/~`';
var stripped = string.replace(/[^A-Za-z0-9]/g, '');
console.log(stripped);

Sorties: '123abcABC'

44
Deminetix

Le problème ne réside pas dans la façon dont vous remplacez les caractères, mais dans la manière dont vous entrez la chaîne.

Seule la première barre oblique inversée de l'entrée est une barre oblique inversée, les autres font partie des caractères de contrôle \r, \b, \f et \n.

Comme ces barres obliques inverses ne sont pas des caractères distincts, mais font partie de la notation permettant d'écrire un seul caractère de contrôle, elles ne peuvent pas être supprimées séparément. C'est à dire. vous ne pouvez pas supprimer la barre oblique inverse de \n car il ne s'agit pas de deux caractères distincts, mais de la manière dont vous écrivez le caractère de contrôle LF ou line feed.

Si vous souhaitez réellement transformer cette entrée en sortie souhaitée, vous devez remplacer chaque caractère de contrôle par la lettre correspondante, par ex. remplacez le caractère \n par le caractère n.

Pour remplacer un caractère de contrôle, vous devez utiliser un jeu de caractères tel que [\r], car \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/

10
Guffa

vous pouvez essayer cette regex:

value.replace(/[\W_-]/g, '');
5
myrcutio

Cela supprime tous les caractères non alphanumériques, préserve la capitalisation et préserve les espaces entre les mots.

function alpha_numeric_filter (string) {

  const alpha_numeric = Array.from('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' + ' ')

  const json_string = JSON.stringify(string)

  let filterd_string = ''

  for (let i = 0; i < json_string.length; i++) {

    let char = json_string[i]
    let index = alpha_numeric.indexOf(char)
    if (index > -1) {
      filterd_string += alpha_numeric[index]
    }

  }

  return filterd_string

}

const input = "\\test\red\bob\fred\new"
console.log(alpha_numeric_filter(input)) //=> testredbobfrednew

const complex_string = "/_&_This!&!! is!@#$% a%^&*() Sentence+=-[]{} 123:;\|\\]||~`/.,><"
console.log(alpha_numeric_filter(complex_string)) //=> This is a Sentence 123
0
Flavio