Supprimez tous les caractères spéciaux sauf l'espace d'une chaîne à l'aide de JavaScript

159

Je souhaite supprimer tous les caractères spéciaux à l'exception de l'espace d'une chaîne à l'aide de JavaScript.

Par exemple, abc's test#s devrait sortir comme abcs tests.

nithi
la source
3
Comment définissez-vous le caractère spécial?
Keith Irwin

Réponses:

351

Vous devez utiliser la fonction de remplacement de chaîne, avec une seule expression régulière. En supposant que vous entendez par caractères spéciaux tout ce qui n'est pas une lettre, voici une solution:

const str = "abc's test#s";
console.log(str.replace(/[^a-zA-Z ]/g, ""));

Petar Ivanov
la source
5
Pour utiliser cette solution sur l' alphabet non-latin s'il vous plaît vérifier cette réponse à
Efkan
Cela supprimera également les caractères numériques!
tech_geek
15
@tech_geek vous pouvez fairestr.replace(/[^a-zA-Z0-9]/g, "")
Chidi Williams
2
En fait, vous avez besoin de cet str.replace(/[^a-zA-Z0-9 ]/g, "");avis, il y a un espace entre 0-9 et]
Ammar Shah
Il a besoin de quelques ajustements, il n'a pas supprimé / ou - les caractères et le premier caractère de camelCase censé être en minuscules, mais celui-ci en majuscules.
Sansun
134

Vous pouvez le faire en spécifiant les caractères que vous souhaitez supprimer:

string = string.replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, '');

Sinon, pour changer tous les caractères à l'exception des chiffres et des lettres, essayez:

string = string.replace(/[^a-zA-Z0-9]/g, '');
Lakshmana Kumar D
la source
4
et si je ne veux pas supprimer d'espace en utilisant ceci? /[^a-zA-Z0-9]/g
aadi1295
8
@ArbazAbid pour garder de l'espace, ajoutez simplement cela aux caractères de la liste blanche. votre expression régulière serait "/ [^ a-zA-Z0-9] / g" (notez les espaces après 9)
Crhistian Ramirez
1
C'était la réponse qui fonctionnait, si un espace était nécessaire.
Nathan
cela remplace ()et whitespacesdans la chaîne.text().replace(/[ ()]/g, '')
C Alonso C Ortega
31

La première solution ne fonctionne pour aucun alphabet UTF-8. (Il coupera du texte tel que Привіт). J'ai réussi à créer une fonction qui n'utilise pas RegExp et utilise un bon support UTF-8 dans le moteur JavaScript. L'idée est simple si un symbole est égal en majuscules et en minuscules, c'est un caractère spécial. La seule exception concerne les espaces.

function removeSpecials(str) {
    var lower = str.toLowerCase();
    var upper = str.toUpperCase();

    var res = "";
    for(var i=0; i<lower.length; ++i) {
        if(lower[i] != upper[i] || lower[i].trim() === '')
            res += str[i];
    }
    return res;
}

Mise à jour: veuillez noter que cette solution ne fonctionne que pour les langues contenant des lettres minuscules et majuscules. Dans des langues comme le chinois, cela ne fonctionnera pas.

Mise à jour 2: Je suis arrivé à la solution originale lorsque je travaillais sur une recherche floue. Si vous essayez également de supprimer des caractères spéciaux pour implémenter la fonctionnalité de recherche, il existe une meilleure approche. Utilisez n'importe quelle bibliothèque de translittération qui produira votre chaîne uniquement à partir de caractères latins, puis la simple expression rationnelle fera toute la magie de la suppression des caractères spéciaux. (Cela fonctionnera également pour le chinois et vous recevrez également des avantages secondaires en faisant Tromsø== Tromso).

Mouette
la source
Merci pour cette solution assez créative. Cela correspond beaucoup plus à la manière dont les langues fonctionnent réellement, puisque beaucoup d'entre nous ne considèrent pas les caractères spéciaux "Привіт" ou "æøå". La plupart des solutions disponibles coupent tout caractère qui ne fait pas partie de l'alphabet anglais.
Alex Langberg
1
Presque la réponse parfaite pour moi, mais malheureusement, il considère les caractères chinois comme des caractères spéciaux.
Eric Majerus
@EricMajerus et hindi aussi
programmeur
Attention, cela considère également les nombres comme des caractères spéciaux.
just_user
11

Je ne connais pas JavaScript, mais n'est-ce pas possible d'utiliser regex?

Quelque chose comme [^\w\d\s]correspondra à tout sauf aux chiffres, aux caractères et aux espaces. Ce serait juste une question pour trouver la syntaxe en JavaScript.

Thiago Moraes
la source
1
stackoverflow.com/a/4374890/2384606 Voici la réponse à votre question :)
Carmela
8

J'ai essayé la solution très créative de Seagul, mais j'ai trouvé qu'elle traitait également les nombres comme des caractères spéciaux, ce qui ne répondait pas à mes besoins. Voici donc mon ajustement (de sécurité) de la solution de Seagul ...

//return true if char is a number
function isNumber (text) {
  if(text) {
    var reg = new RegExp('[0-9]+$');
    return reg.test(text);
  }
  return false;
}

function removeSpecial (text) {
  if(text) {
    var lower = text.toLowerCase();
    var upper = text.toUpperCase();
    var result = "";
    for(var i=0; i<lower.length; ++i) {
      if(isNumber(text[i]) || (lower[i] != upper[i]) || (lower[i].trim() === '')) {
        result += text[i];
      }
    }
    return result;
  }
  return '';
}
Mozfet
la source
Vous avez oublié de déclarer regdans votre première fonction.
Noman Ali
7

rechercher tout pas (caractères de mot || espace):

str.replace(/[^\w ]/, '')
dovid
la source
parfait! suppression de tous les caractères Unicode spéciaux de la chaîne.
abhishake il y a
1

Essayez d'utiliser celui-ci

var result= stringToReplace.replace(/[^\w\s]/gi, '')

ici ^ carat est pour la négation \ w pour [a-zA-Z0-9_] caractères de mot et \ s pour l'espace / [] / gi pour global

Shrinivasan
la source
0

Le point (.) peut ne pas être considéré comme spécial. J'ai ajouté une condition OR à la réponse de Mozfet & Seagull:

function isNumber (text) {
      reg = new RegExp('[0-9]+$');
      if(text) {
        return reg.test(text);
      }
      return false;
    }

function removeSpecial (text) {
  if(text) {
    var lower = text.toLowerCase();
    var upper = text.toUpperCase();
    var result = "";
    for(var i=0; i<lower.length; ++i) {
      if(isNumber(text[i]) || (lower[i] != upper[i]) || (lower[i].trim() === '') || (lower[i].trim() === '.')) {
        result += text[i];
      }
    }
    return result;
  }
  return '';
}
hassanf1
la source
0

const input = `#if_1 $(PR_CONTRACT_END_DATE) == '23-09-2019' # 
Test27919<alerts@imimobile.com> #elseif_1 $(PR_CONTRACT_START_DATE) ==  '20-09-2019' #
Sender539<rama.sns@gmail.com> #elseif_1 $(PR_ACCOUNT_ID) == '1234' #
AdestraSID<hello@imimobile.co> #else_1#Test27919<alerts@imimobile.com>#endif_1#`;
const replaceString = input.split('$(').join('->').split(')').join('<-');


console.log(replaceString.match(/(?<=->).*?(?=<-)/g));

sudheer nunna
la source
-11

Dont les caractères spéciaux que vous souhaitez supprimer d'une chaîne, préparez une liste d'entre eux, puis utilisez la fonction de remplacement javascript pour supprimer tous les caractères spéciaux.

var str = 'abc'de#;:sfjkewr47239847duifyh';
alert(str.replace("'","").replace("#","").replace(";","").replace(":",""));

ou vous pouvez exécuter une boucle pour une chaîne entière et comparer un seul caractère avec le code ASCII et régénérer une nouvelle chaîne.

Gaurav Agrawal
la source
10
Non, ne faites pas ça. C'est vraiment terriblement lent. Il est préférable d'utiliser une expression régulière.
Keith Irwin
Cette solution est très intéressante pour remplacer un seul caractère. Dans mon cas, cela a été utile, merci.
Vahid Najafi
Au lieu d'utiliser la méthode replace plusieurs fois, veuillez l'utiliser une seule fois en utilisant des expressions régulières.
FAISAL