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.

Nithi
quelle
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, ""));

Petar Ivanov
quelle
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, '');
Lakshmana Kumar D.
quelle
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).

Möwe
quelle
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.

Thiago Moraes
quelle
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 '';
}
Mozfet
quelle
Sie haben vergessen, regin Ihrer ersten Funktion zu deklarieren .
Noman Ali
6

suche alle nicht (Wortzeichen || Leerzeichen):

str.replace(/[^\w ]/, '')
dovid
quelle
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

Shrinivasan
quelle
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 '';
}
hassanf1
quelle
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
quelle
-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.

Gaurav Agrawal
quelle
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