Rimuovi tutti i caratteri speciali con RegExp


234

Vorrei un RegExp che rimuoverà tutti i caratteri speciali da una stringa. Sto provando qualcosa di simile ma non funziona in IE7, sebbene funzioni in Firefox.

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

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

Sarebbe utile anche una descrizione dettagliata di RegExp.


18
Qualcosa del genere sarebbe meglio come una lista bianca, non una lista nera. allora potresti semplicemente fare [az] | [0-9] | \ s
Ape-inago

Qualche errore di script? Hai eseguito il debug? Oppure prova un blocco ... cattura il blocco nel codice javascript.
Kangkan,

@Ape-inago, per favore, puoi spiegarmi un po 'di più RegExp
Timothy Ruhle,

3
Si prega di definire "carattere speciale"! "風" è speciale per te? (Pensando a questo vedrai il punto di @Ape-iango.)
ingannare

7
Non penso che nessuno qui abbia significato alcuna offesa. Mi sono bruciato prima facendolo come una lista nera poiché ci sono sempre quei piccoli "gotcha" che finiscono per passare (come gli esempi di inganno). In definitiva l'approccio corretto è più sul motivo per cui stai cercando di farlo.
Ape-inago,

Risposte:


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

Come è stato menzionato nei commenti, è più facile farlo come una lista bianca: sostituisci i personaggi che non sono nella tua lista di sicurezza.

Il carattere caret ( ^) è la negazione dell'insieme [...], gidiciamo globale e senza distinzione tra maiuscole e minuscole (quest'ultimo è un po 'ridondante ma volevo menzionarlo) e l'elenco di indirizzi di sicurezza in questo esempio sono cifre, caratteri di parole, trattini bassi ( \w) e spazi bianchi ( \s).


50
Questa soluzione non funziona con simboli non inglesi. "Їжак" per esempio.
Gabbiano,

4
Puoi anche usare maiuscole \ W anziché ^ \ w. \ W: corrisponde a qualsiasi carattere non di parole. Equivalente a [^ A-Za-z0-9_]. developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
delkant

@Seagull Ho aggiunto una risposta che gestisce Unicodes.
Freedev,

1
per accettare le parole degli accenti, come nella lingua portoghese, fare questo: stringToReplace.replace (/ [^ A-zÀ-ú \ s] / gi, '')
alansiqueira27

1
Per aggiungere la maggior parte delle lingue europee (norvegese, svedese, tedesco, portoghese, spagnolo) stringToReplace.replace (/ [^ \ w \ s \ xc0-xff] / gi, ''). Per includere altre lingue è possibile utilizzare intervalli unicode. Vedi: stackoverflow.com/questions/150033/...
Eskil Mjelva Saatvedt

105

Nota che se desideri comunque escludere un set, inclusi elementi come barre e caratteri speciali, puoi fare quanto segue:

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

notare che per includere anche il carattere "meno", è necessario evitarlo con una barra rovesciata come quest'ultimo gruppo. in caso contrario, selezionerà anche 0-9 che è probabilmente indesiderato.


10
soluzione eccellente! la risposta accettata funziona solo in inglese, funziona su qualsiasi lingua (per quanto ho controllato). grazie :)
Ronen Ness,

1
@knutole rimuove la ?parte del set di caratteri in avanti. questo elenca i personaggi che vuoi rimuovere, quindi escludendolo dallo stripping lo includerà intrinsecamente nel risultato finale.
noinput

Funziona alla grande, si adatta perfettamente a qualsiasi lingua, è sufficiente aggiungere il carattere che si desidera sostituire e questo è tutto. Grazie.
Elros Romeo,

21

Il regex Javascript normale non gestisce le lettere Unicode .

Non utilizzare [^\w\s], questo rimuoverà le lettere con accenti (come àèéìòù), per non parlare del cirillico o cinese, le lettere provenienti da tali lingue saranno completate rimosse.

Non vuoi davvero rimuovere queste lettere insieme a tutti i personaggi speciali. Hai due possibilità:

  • Aggiungi nella tua regex tutti i caratteri speciali che non si desidera rimuovere,
    per esempio: [^èéòàùì\w\s].
  • Dai un'occhiata a xregexp.com . XRegExp aggiunge il supporto di base per la corrispondenza Unicode tramite la \p{...}sintassi.

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>


3
Buono a sapersi per l'internazionalizzazione, non avevo idea che JS regex non fosse interessato a UTF-8.
LessQuesar

Non puoi mettere tutte le lettere UTF-8 valide in var str
Seagull

@Risposta sì, ma nel caso in cui non si stia scrivendo un'applicazione compatibile a livello mondiale, è possibile inserire pragmaticamente solo l'elenco di lettere UTF-8 valide per le proprie localizzazioni correnti. Nel mio caso, per la lingua italiana ci sono solo poche lettere.
Freedev,

7

La prima soluzione non funziona per nessun alfabeto UTF-8. (Taglia il testo come Їжак). Sono riuscito a creare una funzione che non utilizza RegExp e utilizzare un buon supporto UTF-8 nel motore JavaScript. L'idea è semplice se un simbolo è uguale in maiuscolo e minuscolo è un carattere speciale. L'unica eccezione è fatta per gli spazi bianchi.

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;
}

Aggiornamento: si noti che questa soluzione funziona solo per le lingue in cui sono presenti lettere minuscole e maiuscole. In lingue come il cinese, questo non funzionerà.

Aggiornamento 2: sono arrivato alla soluzione originale quando stavo lavorando a una ricerca fuzzy. Se stai anche cercando di rimuovere caratteri speciali per implementare la funzionalità di ricerca, c'è un approccio migliore. Usa qualsiasi libreria di traslitterazione che ti produrrà una stringa solo da caratteri latini e quindi il semplice Regexp farà tutta la magia della rimozione di caratteri speciali. (Funzionerà anche per il cinese e riceverai anche vantaggi collaterali facendo Tromsø== Tromso).


Eccellente, come questa risposta! Lo uso per creare un nome file valido e ho esteso la tua soluzione per rimuovere spazi (compatibile Linux / Unix) e consentire anche i numeri. Quindi ho esteso l'istruzione if (jQuery in questione): if (str [i]! == '' && (lower [i]! = Upper [i] || lower [i] .trim () === '' | | $ .isNumeric (str [i])))
Jonny il

in molte lingue non ci sono lettere maiuscole ... quindi la funzione considererà l'input valido come caratteri speciali
Yair Levy

I caratteri cinesi sono un esempio che vengono messi a nudo da questo
lethek,

Quando ho creato questa soluzione, sfortunatamente, non pensavo a lingue come il cinese. La soluzione deve essere proposta, poiché le risposte precedenti non funzioneranno neanche.
Gabbiano,

1

Uso RegexBuddy per il mio debug regexes ha quasi tutte le lingue molto utili. Di copia / incolla per la lingua di destinazione. Strumento eccezionale e non molto costoso.

Quindi ho copiato / incollato la tua regex e il tuo problema è che [,] sono caratteri speciali in regex, quindi devi scappare. Quindi la regex dovrebbe essere: /!@#$^&%*()+=-[\x5B\x5D[\/{}|:<>?,./im


0

perché non fai qualcosa del tipo:

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

per verificare se il tuo input contiene caratteri speciali


17
L'OP dice che sta cercando di rimuovere personaggi speciali per non vedere se esistono.
annakata,

Questa è una buona soluzione, ma consentirà solo i numeri delle lettere dell'alfabeto inglese e lo spazio, ma rimuoverà i caratteri simili èéòàùìe in alcuni casi questa non sarà la soluzione
mapmalith

0

str.replace(/\s|[0-9_]|\W|[#$%^&*()]/g, "")Ho fatto così. Ma ci sono alcune persone che lo hanno fatto molto più facilmentestr.replace(/\W_/g,"");


La maggior parte delle cose nel tuo approccio sono ridondanti, poiché \Wcontiene alcuni dei personaggi. Ma perché dovresti filtrare i numeri? Questi non sono personaggi speciali.
user4642212
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.