Entfernen Sie mit JavaScript alle Sonderzeichen außer Leerzeichen aus einer Zeichenfolge


157

Ich möchte mit JavaScript alle Sonderzeichen außer Leerzeichen aus einer Zeichenfolge entfernen.

Zum Beispiel abc's test#s sollte ausgegeben werden als abcs tests.


3
Wie definieren Sie Sonderzeichen?
Keith Irwin

Antworten:


348

Sie sollten die Funktion zum Ersetzen von Zeichenfolgen mit einem einzelnen regulären Ausdruck verwenden. Angenommen, mit Sonderzeichen meinen Sie alles, was kein Buchstabe ist. Hier ist eine Lösung:

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


5
Um diese Lösung zu verwenden , um auf nicht-lateinisches Alphabet überprüfen Sie bitte diese Antwort aus
Efkan

Dadurch werden auch numerische Zeichen entfernt!
Tech_geek

15
@tech_geek können Sie tunstr.replace(/[^a-zA-Z0-9]/g, "")
Chidi Williams

2
Eigentlich brauchen Sie diesen str.replace(/[^a-zA-Z0-9 ]/g, "");Hinweis, es gibt ein Leerzeichen zwischen 0-9 und]
Ammar Shah

Es bedarf einiger Anpassungen, es wurden keine / oder - Zeichen entfernt und das erste Zeichen von camelCase sollte in Kleinbuchstaben geschrieben sein, dieses jedoch in Großbuchstaben.
Sansun

132

Sie können dazu die Zeichen angeben, die Sie entfernen möchten:

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

Um alle Zeichen außer Zahlen und Buchstaben zu ändern, versuchen Sie alternativ:

string = string.replace(/[^a-zA-Z0-9]/g, '');

4
Was ist, wenn ich damit keinen Speicherplatz entfernen möchte? /[^a-zA-Z0-9]/g
aadi1295

8
@ArbazBieten Sie, um Platz zu sparen, fügen Sie dies einfach den Zeichen auf der weißen Liste hinzu. Ihr regulärer Ausdruck wäre "/ [^ a-zA-Z0-9] / g" (Leerzeichen nach 9
beachten

1
Dies war die Antwort, die funktioniert hat, wenn ein Platz benötigt wird.
Nathan

Dies ersetzt ()und whitespacesin Zeichenfolge.text().replace(/[ ()]/g, '')
C Alonso C Ortega

30

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 Nebeneffekte, wenn Sie Tromsø== machen Tromso).


Vielen Dank für diese recht kreative Lösung. Es entspricht viel mehr der tatsächlichen Funktionsweise von Sprachen, da viele von uns Sonderzeichen "Привіт" oder "æøå" nicht berücksichtigen. Die meisten Lösungen schneiden alle Zeichen ab, die nicht Teil des englischen Alphabets sind.
Alex Langberg

1
Fast die perfekte Antwort für mich, aber leider werden chinesische Schriftzeichen als Sonderzeichen betrachtet.
Eric Majerus

@ EricMajerus und Hindi auch
Programmierer

Seien Sie vorsichtig, dies betrachtet auch Zahlen als Sonderzeichen.
just_user

11

Ich kenne kein JavaScript, aber ist es nicht möglich, Regex zu verwenden?

So etwas [^\w\d\s]passt zu nichts anderem als Ziffern, Zeichen und Leerzeichen. Es wäre nur eine Frage, die Syntax in JavaScript zu finden.


1
stackoverflow.com/a/4374890/2384606 Dies ist die Antwort auf Ihre Frage :)
Carmela

8

Ich habe Seaguls sehr kreative Lösung ausprobiert, aber festgestellt, dass Zahlen auch als Sonderzeichen behandelt werden, was nicht meinen Anforderungen entspricht. Hier ist meine (ausfallsichere) Optimierung von Seaguls Lösung ...

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

Sie haben vergessen, regin Ihrer ersten Funktion zu deklarieren .
Noman Ali

6

suche alle nicht (Wortzeichen || Leerzeichen):

str.replace(/[^\w ]/, '')

1

Versuchen Sie, diesen zu verwenden

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

hier steht ^ carat für die Negation \ w für [a-zA-Z0-9_] Wortzeichen und \ s für Leerzeichen / [] / gi für global


0

Punkt (.) kann nicht als besonders angesehen werden. Ich habe der Antwort von Mozfet & Seagull eine ODER-Bedingung hinzugefügt:

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

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


-11

Wessen Sonderzeichen Sie aus einer Zeichenfolge entfernen möchten, erstellen Sie eine Liste davon und verwenden Sie dann die Funktion zum Ersetzen von Javascript, um alle Sonderzeichen zu entfernen.

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

Oder Sie können eine Schleife für eine ganze Zeichenfolge ausführen und ein einzelnes Zeichen mit dem ASCII-Code vergleichen und eine neue Zeichenfolge neu generieren.


9
Nein, bitte tu das nicht. Es ist wirklich furchtbar langsam. Es ist viel, viel besser, einen regulären Ausdruck zu verwenden.
Keith Irwin

Diese Lösung ist sehr gut geeignet, um nur ein Zeichen zu ersetzen. In meinem Fall war es hilfreich, danke.
Vahid Najafi

Anstatt die Ersetzungsmethode mehrmals zu verwenden, verwenden Sie sie bitte nur einmal mit regulären Ausdrücken.
FAISAL
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.