Supprimer les caractères non alphanumériques de la chaîne

224

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

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

Je n'ai pas trouvé une solution qui traitera des caractères spéciaux comme \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 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 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"
Bobby Cannon
la source
Question intéressante, le \ n dans \ nouveau est clairement ce qui déclenche cela. Je ne sais pas trop comment trouver et remplacer cela va
Will Buck
1
Les entrées sont-elles échappées / comment sont-elles affectées? var Input = "\\test\red\bob\fred\new"cette chaîne ne contient pas de "rouge" donc votre 1ère tentative est correcte, testez vous contre le littéral "\\\\test\\red\\bob\\fred\\new"?
Alex K.
/[^\w\s]+/giessaye ça.
Bartosz Grzybowski
Je suppose que la question est: les barres obliques inverses dans votre chaîne d'entrée représentent-elles des caractères spéciaux? (Sur la base de votre exemple de sortie, je suppose que non.)
Dave
Vous avez essayé de passer de guillemets doubles à des guillemets simples?
OptimusCrime

Réponses:

468

Suppression de caractères non alphanumériques

Ce qui suit est le / une expression rationnelle correcte pour supprimer les caractères non alphanumériques d'une chaîne d'entrée:

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

Notez que \Wc'est l'équivalent de [^0-9a-zA-Z_]- il inclut 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

Étant donné que 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 s'échapper si elle doit être prise à la lettre:

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

Manipulation de chaînes mal formées

Si vous n'êtes pas en mesure d'échapper correctement la chaîne d'entrée (pourquoi pas?), Ou si elle provient d'une sorte de 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 l'expression régulière de remplacement.

AD7six
la source
10
Cela ne supprime pas les traits de soulignement.
kylex
4
@kylex, c'est parce que les traits de soulignement sont considérés comme faisant partie du groupe alphanumérique, pour une raison quelconque
Eugene Kuzmenko
12
"Parce que ce sont les caractères généralement autorisés dans les identificateurs de variables." . Il n'y a pas de "_" dans la question, bien sûr le remplacer \Wpar [_\W](qui est utilisé dans la question) ou similaire supprimerait les soulignés.
AD7six
1
@ AD7six, pourriez-vous expliquer pourquoi on devrait utiliser JSON.stringify () lorsque la chaîne provient d'une source non fiable? Y a-t-il un problème de sécurité à ne pas le faire? Merci!
jbmusso
1
@guithor Ce n'est pas que "il faut", ou que cela affecte la sécurité du tout; Si "une chaîne" est reçue et pour quelque raison que ce soit, elle est essentiellement borked (pas évident à la question de savoir pourquoi la chaîne est reçue mal formée) - cela permet de voir la chaîne pour ce qu'elle est: jsfiddle.net/Z6N7C
AD7six
49

Toutes les réponses actuelles ont encore des bizarreries, 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 j'ai pu trouver sur le clavier:

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

Sorties: '123abcABC'

Deminetix
la source
1
input.replace(/\W/g, '')laisse dans _une chaîne. @Deminetix a raison string.replace(/[^A-Za-z0-9]/g, '');fonctionne mieux car il supprime tous les caractères non alphanumériques de la chaîne.
Tim
1
Et pourtant, aucune permutation de cette réponse ne répond réellement à la question posée .
AD7six
10

Le problème n'est pas avec la façon dont vous remplacez les caractères, le problème est avec la façon dont vous entrez la chaîne.

Il est seulement la première barre oblique inverse dans l'entrée qui est un caractère de barre oblique inverse, les autres font partie des caractères de contrôle \r, \b, \fet \n.

Comme ces barres obliques inverses ne sont pas des caractères séparés, mais font partie de la notation pour écrire un seul caractère de contrôle, elles ne peuvent pas être supprimées séparément. C'est-à-dire que vous ne pouvez pas supprimer la barre oblique inverse \ncar ce ne sont pas deux caractères distincts, c'est la façon dont vous écrivez le caractère de contrôle LFou le saut de ligne .

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

Pour remplacer un caractère de contrôle, vous devez utiliser un jeu de caractères comme [\r], comme cela \ra une signification spéciale 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/

Guffa
la source
Je comprends tout ce que vous dites, mais la question est toujours d'actualité et personne n'a encore suggéré la bonne réponse. L'entrée peut être des modifications, mais personne n'a suggéré de réponse sur la façon de la modifier par programme dans JS.
Bobby Cannon
2
@BobbyCannon: J'ai ajouté du code qui prend votre entrée exacte et produit la sortie souhaitée.
Guffa
5

vous pouvez essayer cette expression régulière:

value.replace(/[\W_-]/g, '');
myrcutio
la source
par la question: je veux juste me débarrasser de tout ce qui n'est pas alphanumérique. quelle sortie attendiez-vous?
myrcutio
0

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
Flavio
la source
Cela ne fonctionne pas (veuillez lire la question) - C'est aussi une façon assez complexe de faire les choses.
AD7six
1
@ AD7six merci d'avoir signalé mon erreur. Lorsque je copie collé l'entrée dans WebStrom, il ajoute automatiquement 2 barres obliques inverses supplémentaires à chaque barre oblique inverse existante. Je n'ai pas remarqué cela. input = "\\ test \ red \ bob \ fred \ new" -> copy_paste = "\\\\ test \\ red \\ bob \\ fred \\ new".
Flavio
-1

Voici un exemple que vous pouvez utiliser,

function removeNonAplhaNumeric(str){
    return str.replace(/[\W_]/g,"");
}

removeNonAplhaNumeric("0_0 (: /-\ :) 0-0");
ravi kishore
la source
-3

Si vous voulez avoir cette \\test\red\bob\fred\newchaîne, vous devez échapper à toutes les barres obliques inverses ( \). Lorsque vous écrivez, \\test\\red\\bob\\fred\\newvotre chaîne contient en fait des barres obliques inverses simples. Vous pouvez être sûr de l'impression de votre chaîne.
Donc, si les barres obliques inverses dans votre chaîne sont échappées, myString.replace(/\W/g,'')cela fonctionnera normalement.

shift66
la source
1
Si vous souhaitez suggérer "vous devez échapper à toutes les barres obliques inverses ()", vous devez fournir un exemple sur la façon de procéder.
Bobby Cannon
Que pensez-vous des doubles barres obliques inverses ??? et ce que je veux dire en disant "Lorsque vous écrivez \\ test \\ rouge \\ bob \\ fred \\ nouveau votre chaîne contient en fait des barres obliques inverses simples." ??? Cela n’explique-t-il pas?
shift66
L'entrée est "\\ test \ red \ bod \ fred \ new" et ne peut pas changer. J'ai besoin d'une solution pour cette chaîne d'entrée. Si vous voulez me montrer comment "échapper aux contre-obliques", donnez un exemple. Nous ne pouvons pas modifier l'entrée. Voir la réponse acceptée. La solution a permis à l'entrée de ne pas changer mais a donné la sortie souhaitée.
Bobby Cannon