Entfernen Sie alle nicht numerischen Zeichen von der Zeichenfolge in JavaScript


701

Stellen Sie sich ein Nicht-DOM-Szenario vor, in dem Sie alle nicht numerischen Zeichen mit JavaScript / ECMAScript aus einer Zeichenfolge entfernen möchten. Alle Zeichen, die sich in Reichweite befinden, 0 - 9sollten beibehalten werden.

var myString = 'abc123.8<blah>';

//desired output is 1238

Wie würden Sie dies in einfachem JavaScript erreichen? Bitte denken Sie daran, dass dies ein Nicht-DOM-Szenario ist, sodass jQuery und andere Lösungen mit Browser- und Tastendruckereignissen nicht geeignet sind.

Antworten:


1431

Verwenden Sie die .replaceMethode der Zeichenfolge mit einem regulären Ausdruck von. Hierbei \Dhandelt es sich um eine Kurzzeichenklasse, die allen nichtstelligen Zeichen entspricht:

myString = myString.replace(/\D/g,'');

5
Danke csj; Überall finden Sie weitere Informationen \D?
p.campbell

34
Dies ist meine Standardregex-Referenz: regulär - expressions.info / reference.html Die integrierten Zeichenklassen verfügen jeweils über integrierte Ergänzungen. \ d \ D (Ziffern gegen alles außer Ziffern) \ w \ W (Wortzeichen gegen alles außer Wortzeichen) \ s \ S (Leerzeichen gegen alles außer Leerzeichen)
csj

3
Um es klar zu machen, hier ist die Syntax zum Ersetzen: w3schools.com/jsref/jsref_obj_regexp.asp, da die Schrägstriche und das "g" Teil dieses Befehls und nicht Teil des RegEx sind.
Mike K

funktioniert replacemit genau dieser Syntax in allen Browsern? Anscheinend erinnere ich mich, dass ich object has no method 'replace' eine ältere Version von IE erhalten habe, wenn ich diese mit Text verwendet habe, den ich mit jQuery gepackt habe ... oder so ähnlich.
CWD

@cwd Ich habe keine Ahnung, was in früheren oder aktuellen Browsern unterstützt wurde. In der Frage wurde ein Nicht-DOM-Kontext angegeben, sodass das Poster wahrscheinlich in einer Umgebung ohne Webbrowser erstellt wurde.
CSJ

354

Wenn Sie dies benötigen, um den Punkt für Gleitkommazahlen zu belassen, verwenden Sie dies

var s = "-12345.50 €".replace(/[^\d.-]/g, ''); // gives "-12345.50"

6
Regexp-Experten? Wie man das macht, erlaubt nur einen einzigen Punkt (sehr relevant bei Zahlen). Vielen Dank!
Kasperi

1
Was meinst du? Geben Sie ein Beispiel für Eingabe und Ausgabe
max4ever

2
Nicht gut: "aaa 2.9px of bbb.".replace(/[^\d.-]/g, '')2.9.Sollte einen String
entfernen, der

2
@ max4ever Sie mein Leben gerettet, danke für die Behandlung -(negative) Zahl Fall :)
Pankaj Parkar

4
@ Kasperi vielleicht:parseFloat("-1234.5.50 €".replace(/[^\d.-]/g, ''))
A. Genedy


23

Sie können RegExp verwenden, um alle nichtstelligen Zeichen zu ersetzen :

var myString = 'abc123.8<blah>';
myString = myString.replace(/[^\d]/g, ''); // 1238

22

Etwas in der Art von:

yourString = yourString.replace ( /[^0-9]/g, '' );

10
Nicht gerade eine Antwort auf die ursprüngliche Frage, aber eine Version, die den Dezimalpunkt behandelt:yourString = yourString.replace ( /[^0-9.]/g, '' );
Maxim Mai


0

In Angular / Ionic / VueJS habe ich mir gerade eine einfache Methode ausgedacht:

stripNaN(txt: any) {
    return txt.toString().replace(/[^a-zA-Z0-9]/g, "");
}

Verwendung in der Ansicht:

<a [href]="'tel:'+stripNaN(single.meta['phone'])" [innerHTML]="stripNaN(single.meta['phone'])"></a>

0

Leider hat keine der obigen Antworten für mich funktioniert.

Ich wollte Währungszahlen aus Zeichenfolgen wie $123,232,122.11(1232332122.11) oder USD 123,122.892(123122.892) oder einer beliebigen Währung wie ₹ 98,79,112.50(9879112.5) konvertieren, um eine Zahlenausgabe einschließlich des Dezimalzeigers zu erhalten.

Musste meine eigene Regex machen, die ungefähr so ​​aussieht:

str = str.match(/\d|\./g).join('');

0

Kurze Funktion zum Entfernen aller nicht numerischen Zeichen, aber Beibehalten der Dezimalstelle (und Zurückgeben der Zahl):

parseNum = str => +str.replace(/[^.\d]/g, '');
let str = 'a1b2c.d3e';
console.log(parseNum(str));


-5

Wir sind in 2017 jetzt können Sie auch ES2016 verwenden

var a = 'abc123.8<blah>';
console.log([...a].filter( e => isFinite(e)).join(''));

oder

console.log([...'abc123.8<blah>'].filter( e => isFinite(e)).join(''));  

Das Ergebnis ist

1238

12
Dies ist ein sehr ineffizienter Weg, um diesen Vorgang durchzuführen.
Djheru

Was ist hier ineffizient oder schlecht?
Vladislav Kostenko

5
Es konvertiert die Zeichenfolge über eine Ersatzmethode in ein Array aus Zeichenfolgen mit einem Zeichen und wendet dann die Filterfunktion über JavaScript auf jedes Arrayelement an, wobei ein neues Zeichenfolgenarray zurückgegeben wird, um dieses Array schließlich wieder zu einer Zeichenfolge zusammenzufügen. Regex nimmt eine Zeichenfolge und gibt eine Zeichenfolge zurück. Die Verarbeitung erfolgt über nativen Code.
ShortFuse
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.