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.

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

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"

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


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

22

Coś w stylu:

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

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

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>

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

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


-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

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.