Usuń wszystkie znaki nienumeryczne z ciągu znaków w JavaScript

701

Rozważ scenariusz inny niż DOM, w którym chcesz usunąć wszystkie znaki nienumeryczne z ciągu przy użyciu JavaScript / ECMAScript. Wszelkie postacie znajdujące się w zasięgu 0 - 9powinny zostać zachowane.

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

//desired output is 1238

Jak osiągnąłbyś to w zwykłym JavaScript? Pamiętaj, że jest to scenariusz inny niż DOM, więc jQuery i inne rozwiązania dotyczące zdarzeń przeglądarki i naciśnięcia klawisza nie są odpowiednie.

p.campbell
źródło

Odpowiedzi:

1430

Użyj metody ciągu .replacez wyrażeniem regularnym \D, który jest stenograficzną klasą znaków, która pasuje do wszystkich znaków innych niż cyfry:

myString = myString.replace(/\D/g,'');
csj
źródło
5
Dzięki csj; gdziekolwiek znajdziesz więcej informacji \D?
p.campbell
34
To jest moje domyślne odwołanie do wyrażenia regularnego: regular-expressions.info/reference.html Każda z wbudowanych klas znaków ma wbudowane uzupełnienia. \ d \ D (cyfry porównaniu wszystkim jednak cyfry) (charcters słowo porównaniu wszystko oprócz tekstu znaków) \ w \ w \ S \ S (odstępami, ale w porównaniu do wszystkich spacji)
CSJ
3
Dla jasności, oto składnia na replace: w3schools.com/jsref/jsref_obj_regexp.asp, ponieważ ukośniki i „g” są częścią tego polecenia, a nie częścią RegEx.
Mike K
czyni replacepracę z taką składnią we wszystkich przeglądarkach? wygląda na to, że pamiętam, że dostałem object has no method 'replace' starszą wersję IE, kiedy korzystałem z tego tekstu z jQuery ... lub coś takiego.
cwd
@cwd Nie mam pojęcia, co było obsługiwane w poprzednich lub obecnych przeglądarkach. W pytaniu określono kontekst inny niż DOM, więc prawdopodobne jest, że plakat był skryptowany w środowisku innym niż przeglądarka internetowa.
csj
354

Jeśli potrzebujesz tego, aby pozostawić kropkę dla liczb zmiennoprzecinkowych, użyj tego

var s = "-12345.50 €".replace(/[^\d.-]/g, ''); // gives "-12345.50"
max4ever
źródło
6
Jakiś ekspert od wyrażeń regularnych? Jak to zrobić, zezwalaj tylko na jedną kropkę (bardzo istotne z liczbami). Dzięki!
Kasperi
1
co masz na myśli? podaj przykład wejścia i wyjścia
max4ever
2
Niezbyt dobrze: "aaa 2.9px of bbb.".replace(/[^\d.-]/g, '')2.9.Powinien usunąć dowolny ciąg
znaków,
2
@ max4ever uratowałeś mi życie, dziękuję za rozpatrzenie -(ujemnej) liczby przypadków :)
Pankaj Parkar
4
@Kasperi być może:parseFloat("-1234.5.50 €".replace(/[^\d.-]/g, ''))
A. Genedy
50

Użyj wyrażenia regularnego, jeśli implementacja skryptu je obsługuje. Coś jak:

myString.replace(/[^0-9]/g, '');
Auraseer
źródło
12
Z jakiegoś powodu ten sposób wydaje się znacznie bardziej czytelny niż [^ \ d].
Arman Bimatov
1
po co ogranicznik regex?
Native Coder
3
@NativeCoder stackoverflow.com/questions/12993629/…
RagnaRock
23

Możesz użyć RegExp, aby zastąpić wszystkie znaki inne niż cyfry:

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

Coś w stylu:

yourString = yourString.replace ( /[^0-9]/g, '' );
Jan Hančič
źródło
10
Nie do końca odpowiedź na pierwotne pytanie, ale wersja do obsługi kropki dziesiętnej:yourString = yourString.replace ( /[^0-9.]/g, '' );
Maxim Mai
0

próbować

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

Kamil Kiełczewski
źródło
0

W Angular / Ionic / VueJS - właśnie wymyśliłem prostą metodę:

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

Użycie w widoku:

<a [href]="'tel:'+stripNaN(single.meta['phone'])" [innerHTML]="stripNaN(single.meta['phone'])"></a>
Dotacja
źródło
0

Niestety żadna z powyższych odpowiedzi nie działała dla mnie.

Chciałem konwertować numery walut z ciągów takich jak $123,232,122.11(1232332122.11) lub USD 123,122.892(123122.892) lub dowolnej innej waluty, takiej jak₹ 98,79,112.50 (9879112.5), aby uzyskać wynik liczbowy, w tym wskaźnik dziesiętny.

Musiałem zrobić własne wyrażenie regularne, które wygląda mniej więcej tak:

str = str.match(/\d|\./g).join('');
Legion Chaosu
źródło
0

Krótka funkcja do usuwania wszystkich znaków nienumerycznych, ale zachowująca liczbę dziesiętną (i zwraca liczbę):

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

jackozaur
źródło
-5

jesteśmy w 2017 roku, teraz możesz także używać ES2016

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

lub

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

Wynik to

1238
Frank Wiśniewski
źródło
12
Jest to bardzo nieefektywny sposób wykonania tej operacji.
djheru,
co jest tutaj nieefektywne lub złe?
Vladislav Kostenko
5
Konwertuje ciąg znaków na tablicę ciągów jednoznakowych metodą rezerwową, a następnie stosuje funkcję filtrowania w JavaScript w każdym elemencie tablicy, zwracając nową tablicę ciągów, aby w końcu połączyć tę tablicę z powrotem w ciąg. Regex pobiera ciąg i zwraca ciąg, a przetwarzanie odbywa się za pomocą kodu natywnego.
ShortFuse,