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.

p.campbell
quelle

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,'');
csj
quelle
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"
max4ever
quelle
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
50

Verwenden Sie einen regulären Ausdruck, wenn Ihre Skriptimplementierung diese unterstützt. Etwas wie:

myString.replace(/[^0-9]/g, '');
Auraseer
quelle
12
Aus irgendeinem Grund scheint dieser Weg viel lesbarer zu sein als [^ \ d].
Arman Bimatov
1
Wofür ist das g nach dem Regex-Trennzeichen?
Native Coder
3
@ NativeCoder stackoverflow.com/questions/12993629/…
RagnaRock
23

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

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

Etwas in der Art von:

yourString = yourString.replace ( /[^0-9]/g, '' );
Jan Hančič
quelle
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

Versuchen

myString.match(/\d/g).join``

Kamil Kiełczewski
quelle
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>
Gewähren
quelle
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('');
Chaos Legion
quelle
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));

Jackosaurier
quelle
-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
Frank Wisniewski
quelle
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