Supprimez tous les caractères spéciaux avec RegExp

234

Je voudrais un RegExp qui supprimera tous les caractères spéciaux d'une chaîne. J'essaie quelque chose comme ça, mais cela ne fonctionne pas dans IE7, bien que cela fonctionne dans Firefox.

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

for (var i = 0; i < specialChars.length; i++) {
  stringToReplace = stringToReplace.replace(new RegExp("\\" + specialChars[i], "gi"), "");
}

Une description détaillée du RegExp serait également utile.

Timothy Ruhle
la source
18
Quelque chose comme ça serait mieux comme une liste blanche, pas une liste noire. alors vous pouvez simplement faire [az] | [0-9] | \ s
Ape-inago
Une erreur de script? Avez-vous débogué? Ou bien mettez un bloc try ... catch dans le code javascript.
Kangkan
@ Ape-inago pouvez-vous s'il vous plaît expliquer un peu plus RegExp s'il vous plaît
Timothy Ruhle
3
Veuillez définir "caractère spécial"! "風" est-il spécial pour vous? (En y réfléchissant, vous verrez le point de @ Ape-iango.)
deceze
7
Je ne pense pas que quiconque ici ait signifié une infraction. Je me suis brûlé avant en le faisant comme une liste noire car il y a toujours ces petits "pièges" qui finissent par passer (comme les exemples de Deceze). En fin de compte, la bonne approche consiste davantage à savoir pourquoi vous essayez de le faire.
Ape-inago

Réponses:

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

Comme cela a été mentionné dans les commentaires, il est plus facile de le faire en tant que liste blanche - remplacez les caractères qui ne figurent pas dans votre liste de sécurité.

Le caractère caret ( ^) est la négation de l'ensemble [...], gidisons global et insensible à la casse (ce dernier est un peu redondant mais je voulais le mentionner) et la liste sûre dans cet exemple est les chiffres, les mots, les traits de soulignement ( \w) et les espaces ( \s).

annakata
la source
50
Cette solution ne fonctionne pas pour les symboles non anglais. "Їжак" par exemple.
Seagull
4
Vous pouvez également utiliser des majuscules \ W au lieu de ^ \ w. \ W: correspond à tout caractère autre qu'un mot. Équivalent à [^ A-Za-z0-9_]. developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
delkant
@Seagull J'ai ajouté une réponse qui gère les Unicodes.
freedev
1
pour accepter les mots accentués, comme en portugais, faites ceci: stringToReplace.replace (/ [^ A-zÀ-ú \ s] / gi, '')
alansiqueira27
1
Pour ajouter la plupart des langues européennes (norvégien, suédois, allemand, portoguise, espagnol) stringToReplace.replace (/ [^ \ w \ s \ xc0-xff] / gi, ''). Pour inclure d'autres langues, des plages unicode peuvent être utilisées. Voir: stackoverflow.com/questions/150033/…
Eskil Mjelva Saatvedt
105

Notez que si vous souhaitez toujours exclure un ensemble, y compris des éléments tels que des barres obliques et des caractères spéciaux, vous pouvez effectuer les opérations suivantes:

var outString = sourceString.replace(/[`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, '');

veuillez noter que pour inclure également le caractère "moins", vous devez lui échapper avec une barre oblique inverse comme ce dernier groupe. si vous ne le faites pas, il sélectionnera également 0-9, ce qui n'est probablement pas souhaité.

pas d'entrée
la source
10
excellente solution! la réponse acceptée ne fonctionne qu'en anglais, cela fonctionne dans toutes les langues (pour autant que j'ai vérifié). merci :)
Ronen Ness
1
@knutole supprime la ?partie du jeu de caractères vers l'avant. cela répertorie les caractères que vous souhaitez supprimer, donc l'exclure de la suppression sera inclus par nature dans le résultat final.
noinput
Cela fonctionne très bien, convient parfaitement à n'importe quelle langue, il suffit d'ajouter le caractère que vous souhaitez remplacer et c'est tout. Merci.
Elros Romeo
21

Le regex Javascript ordinaire ne gère pas les lettres Unicode .

Ne pas utiliser [^\w\s], cela supprimera les lettres avec des accents (comme àèéìòù), sans parler du cyrillique ou du chinois, les lettres provenant de ces langues seront complétées supprimées.

Vous ne voulez vraiment pas supprimer ces lettres avec tous les caractères spéciaux. Vous avez deux chances:

  • Ajouter dans votre regex tous les caractères spéciaux que vous ne voulez pas supprimer,
    par exemple: [^èéòàùì\w\s].
  • Jetez un œil à xregexp.com . XRegExp ajoute le support de base pour la correspondance Unicode via la \p{...}syntaxe.

var str = "Їжак::: résd,$%& adùf"
var search = XRegExp('([^?<first>\\pL ]+)');
var res = XRegExp.replace(str, search, '',"all");

console.log(res); // returns "Їжак::: resd,adf"
console.log(str.replace(/[^\w\s]/gi, '') ); // returns " rsd adf"
console.log(str.replace(/[^\wèéòàùì\s]/gi, '') ); // returns " résd adùf"
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.1.1/xregexp-all.js"></script>

Liberté
la source
3
Bon à savoir pour l'internationalisation, je n'avais aucune idée que JS regex n'était pas soucieux de l'UTF-8.
LessQuesar
Vous ne pouvez pas mettre toutes les lettres UTF-8 valides dans var str
Seagull
@Seagull oui, mais si vous n'écrivez pas d'application compatible dans le monde entier, vous pouvez pragmatiquement mettre uniquement la liste des lettres UTF-8 valides pour vos localisations actuelles. Dans mon cas, pour la langue italienne, il n'y a que peu de lettres.
freedev
7

La première solution ne fonctionne pour aucun alphabet UTF-8. (Il coupera le 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 majuscule et en minuscule c'est un caractère spécial. La seule exception concerne les espaces blancs.

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 comportant des minuscules et des majuscules. Dans des langues comme le chinois, cela ne fonctionnera pas.

Mise à jour 2: je suis arrivé à la solution d'origine 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 vous produira une chaîne uniquement à partir de caractères latins, puis la simple expression régulière fera toute la magie pour supprimer les caractères spéciaux. (Cela fonctionnera également pour le chinois et vous bénéficierez également d'avantages secondaires en faisant Tromsø== Tromso).

Mouette
la source
Excellent, comme cette réponse! Je l'utilise pour créer un nom de fichier valide et je l'ai étendu votre solution pour supprimer les espaces (compatible Linux / Unix) et autoriser les nombres ainsi. J'ai donc étendu l'instruction if (jQuery impliqué): if (str [i]! == '' && (lower [i]! = Upper [i] || lower [i] .trim () === '' | | $ .isNumeric (str [i])))
Jonny
dans de nombreuses langues, il n'y a pas de lettres majuscules ... par conséquent, la fonction considérera les entrées valides comme des caractères spéciaux
Yair Levy
Les caractères chinois en sont un exemple qui est dépouillé par cela
lethek
Quand j'ai créé cette solution, malheureusement, je ne pensais pas à des langues comme le chinois. La solution doit être proposée, car les réponses précédentes ne fonctionneront pas non plus.
Seagull
1

J'utilise RegexBuddy pour déboguer mes regex, il a presque toutes les langues très utiles. Que copier / coller pour la langue cible. Super outil et pas très cher.

J'ai donc copié / collé votre expression régulière et votre problème est que [,] sont des caractères spéciaux dans l'expression régulière, vous devez donc y échapper. Donc, l'expression régulière doit être: /!@#$^&%*()+=-[\x5B\x5D indirect\/{}|:<>?,./im

millebii
la source
0

pourquoi ne faites-vous pas quelque chose comme:

re = /^[a-z0-9 ]$/i;
var isValid = re.test(yourInput);

pour vérifier si votre entrée contient des caractères spéciaux

Et
la source
17
L'OP dit qu'il essaie de supprimer les caractères spéciaux pour ne pas voir s'ils existent.
annakata
C'est une bonne solution, mais cela n'autorisera que les numéros de lettres de l'alphabet anglais et l'espace, mais cela supprimera les caractères comme èéòàùìet dans certains cas, ce ne sera pas la solution
mapmalith
0

str.replace(/\s|[0-9_]|\W|[#$%^&*()]/g, "")Je l'ai fait comme ça. Mais il y a des gens qui l'ont fait beaucoup plus facilement commestr.replace(/\W_/g,"");

Eldar Mammadov
la source
La plupart des choses dans votre approche sont redondantes, car \Wcontient certains des personnages. Mais pourquoi voudriez-vous filtrer les chiffres? Ce ne sont pas des caractères spéciaux.
user4642212