Entfernen Sie alle Sonderzeichen mit RegExp

233

Ich möchte ein RegExp, das alle Sonderzeichen aus einer Zeichenfolge entfernt. Ich versuche so etwas, aber es funktioniert nicht in IE7, obwohl es in Firefox funktioniert.

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

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

Eine detaillierte Beschreibung des RegExp wäre ebenfalls hilfreich.

Timothy Ruhle
quelle
18
So etwas wäre besser als weiße Liste, nicht als schwarze Liste. dann könnten Sie einfach [az] | [0-9] | \ s
Ape-inago
Irgendein Skriptfehler? Hast du debuggt? Oder setzen Sie einen try ... catch-Block in den Javascript-Code.
Kangkan
@ Ape-inago können Sie mir bitte RegExp etwas näher erläutern
Timothy Ruhle
3
Bitte definieren Sie "Sonderzeichen"! Ist "風" etwas Besonderes für dich? (Wenn Sie darüber nachdenken, werden Sie @ Ape-iangos Punkt sehen.)
Täuschung
7
Ich glaube nicht, dass jemand hier eine Beleidigung bedeutete. Ich habe mich schon einmal verbrannt, indem ich es als schwarze Liste gemacht habe, da es immer diese kleinen "Gotchas" gibt, die am Ende durchkommen (wie die Beispiele von Deceze). Letztendlich geht es beim richtigen Ansatz eher darum, warum Sie dies versuchen.
Ape-inago

Antworten:

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

Wie in den Kommentaren erwähnt, ist es einfacher, dies als Whitelist zu tun - ersetzen Sie die Zeichen, die nicht in Ihrer Sicherheitsliste enthalten sind.

Das ^Zeichen caret ( ) ist die Negation der Menge [...], z. giB. global und ohne Berücksichtigung der Groß- und Kleinschreibung (letzteres ist etwas redundant, aber ich wollte es erwähnen), und die Sicherheitsliste in diesem Beispiel besteht aus Ziffern, Wortzeichen, Unterstrichen ( \w) und Leerzeichen () \s).

Annakata
quelle
50
Diese Lösung funktioniert nicht für nicht englische Symbole. "Їжак" zum Beispiel.
Möwe
4
Sie können auch Großbuchstaben \ W anstelle von ^ \ w verwenden. \ W: Entspricht einem beliebigen Nicht-Wort-Zeichen. Entspricht [^ A-Za-z0-9_]. developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
delkant
@Seagull Ich habe eine Antwort hinzugefügt, die Unicodes behandelt.
Freedev
1
Um Akzentwörter wie in der portugiesischen Sprache zu akzeptieren, gehen Sie wie folgt vor: stringToReplace.replace (/ [^ A-zÀ-ú \ s] / gi, '')
alansiqueira27
1
Hinzufügen der meisten europäischen Sprachen (Norwegisch, Schwedisch, Deutsch, Portoguise, Spanisch) stringToReplace.replace (/ [^ \ w \ s \ xc0-xff] / gi, ''). Um andere Sprachen einzuschließen, können Unicode-Bereiche verwendet werden. Siehe: stackoverflow.com/questions/150033/…
Eskil Mjelva Saatvedt
104

Beachten Sie, dass Sie Folgendes tun können, wenn Sie einen Satz, einschließlich Schrägstriche und Sonderzeichen, weiterhin ausschließen möchten:

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

Beachten Sie besonders, dass Sie, um auch das "Minus" -Zeichen einzuschließen, mit einem Backslash wie der letzteren Gruppe davonkommen müssen. Wenn Sie dies nicht tun, wird auch 0-9 ausgewählt, was wahrscheinlich unerwünscht ist.

keine Eingabe
quelle
10
ausgezeichnete Lösung! Die akzeptierte Antwort funktioniert nur auf Englisch, dies funktioniert in allen Sprachen (soweit ich das überprüft habe). danke :)
Ronen Ness
1
@knutole entferne den ?Teil des Zeichensatzes nach vorne. Dadurch werden die Zeichen aufgelistet, die Sie entfernen möchten. Wenn Sie sie also vom Strippen ausschließen, wird sie von Natur aus in das Endergebnis aufgenommen.
Noinput
Dies funktioniert hervorragend, passt perfekt zu jeder Sprache, muss nur das Zeichen hinzufügen, das Sie ersetzen möchten, und das ist alles. Vielen Dank.
Elros Romeo
21

Normaler Javascript-Regex verarbeitet keine Unicode-Buchstaben .

Nicht verwenden [^\w\s], dies entfernt Buchstaben mit Akzenten (wie àèéìòù), ganz zu schweigen von Kyrillisch oder Chinesisch. Buchstaben aus solchen Sprachen werden vollständig entfernt.

Sie möchten diese Buchstaben wirklich nicht zusammen mit allen Sonderzeichen entfernen. Sie haben zwei Chancen:

  • Fügen Sie in Ihrer Regex alle Sonderzeichen hinzu, die Sie nicht entfernen möchten,
    zum Beispiel : [^èéòàùì\w\s].
  • Schauen Sie sich xregexp.com an . XRegExp bietet Basisunterstützung für den Unicode-Abgleich über die \p{...}Syntax.

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>

freedev
quelle
3
Gut zu wissen für die Internationalisierung, ich hatte keine Ahnung, dass JS Regex nicht UTF-8-orientiert war.
LessQuesar
Sie können nicht alle gültigen UTF-8-Buchstaben in var str
Seagull
@Seagull ja, aber falls Sie keine weltweit kompatible Anwendung schreiben, können Sie pragmatisch nur die Liste der gültigen UTF-8-Buchstaben für Ihre aktuellen Lokalisierungen einfügen. In meinem Fall gibt es für die italienische Sprache nur wenige Buchstaben.
freedev
7

Die erste Lösung funktioniert für kein UTF-8-Alphabet. (Es wird Text wie Їжак schneiden). Ich habe es geschafft, eine Funktion zu erstellen, die RegExp nicht verwendet und eine gute UTF-8-Unterstützung in der JavaScript-Engine verwendet. Die Idee ist einfach, wenn ein Symbol in Groß- und Kleinbuchstaben gleich ist und es sich um ein Sonderzeichen handelt. Die einzige Ausnahme gilt für Leerzeichen.

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

Update: Bitte beachten Sie, dass diese Lösung nur für Sprachen mit Klein- und Großbuchstaben funktioniert. In Sprachen wie Chinesisch funktioniert dies nicht.

Update 2: Ich bin zur ursprünglichen Lösung gekommen, als ich an einer Fuzzy-Suche gearbeitet habe. Wenn Sie auch versuchen, Sonderzeichen zu entfernen, um die Suchfunktion zu implementieren, gibt es einen besseren Ansatz. Verwenden Sie eine beliebige Transliterationsbibliothek, die nur Zeichenfolgen aus lateinischen Zeichen erzeugt, und dann entfernt der einfache Regexp alle Sonderzeichen. (Dies funktioniert auch für Chinesisch und Sie erhalten auch Nebenleistungen, wenn Sie Tromsø== machen Tromso).

Möwe
quelle
Ausgezeichnet, wie diese Antwort! Ich verwende es zum Erstellen eines gültigen Dateinamens und habe Ihre Lösung erweitert, um Leerzeichen zu entfernen (Linux / Unix-kompatibel) und auch Zahlen zuzulassen. Also habe ich die if-Anweisung erweitert (jQuery beteiligt): if (str [i]! == '' && (lower [i]! = Upper [i] || lower [i] .trim () === '' | | $ .isNumeric (str [i])))
Jonny
In vielen Sprachen gibt es keine Großbuchstaben ... daher betrachtet die Funktion gültige Eingaben als Sonderzeichen
Yair Levy
Chinesische Schriftzeichen sind ein Beispiel, das dadurch gestrippt wird
lethek
Als ich diese Lösung entwickelte, dachte ich leider nicht an Sprachen wie Chinesisch. Die Lösung muss vorgeschlagen werden, da die vorherigen Antworten auch nicht funktionieren.
Möwe
1

Ich benutze RegexBuddy zum Debuggen meiner Regexes, es hat fast alle Sprachen sehr nützlich. Dann kopieren / einfügen für die Zielsprache. Tolles Werkzeug und nicht sehr teuer.

Also habe ich Ihre Regex kopiert / eingefügt und Ihr Problem ist, dass [,] Sonderzeichen in Regex sind, also müssen Sie ihnen entkommen. Der reguläre Ausdruck sollte also sein: /!@#$^&%*()+=-[\x5B\x5D weiblicher\\ {{: •>

millebii
quelle
0

Warum tust du nicht so etwas wie:

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

um zu überprüfen, ob Ihre Eingabe ein spezielles Zeichen enthält

Und
quelle
17
Das OP sagt, dass er versucht, Sonderzeichen zu entfernen, ohne zu sehen, ob sie existieren.
Annakata
Dies ist eine gute Lösung, aber dies erlaubt nur englische Alphabetbuchstaben und das Leerzeichen, aber es entfernt Zeichen wie èéòàùìund in einigen Fällen wird dies nicht die Lösung sein
Mapmalith
0

str.replace(/\s|[0-9_]|\W|[#$%^&*()]/g, "")Ich habe etw so gemacht. Aber es gibt einige Leute, die es viel einfacher gemacht habenstr.replace(/\W_/g,"");

Eldar Mammadov
quelle
Die meisten Dinge in Ihrem Ansatz sind redundant, da sie \Weinige der Zeichen enthalten. Aber warum sollten Sie Zahlen herausfiltern? Das sind keine Sonderzeichen.
user4642212