Убрать все нечисловые символы из строки в JavaScript

703

Рассмотрим сценарий без DOM, в котором вы хотите удалить все нечисловые символы из строки, используя JavaScript / ECMAScript. Любые символы в диапазоне 0 - 9должны быть сохранены.

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

//desired output is 1238

Как бы вы достигли этого простым JavaScript? Пожалуйста, помните, что это сценарий без DOM, поэтому jQuery и другие решения, включающие события браузера и нажатия клавиш, не подходят.

p.campbell
источник

Ответы:

1434

Используйте метод строки .replaceс регулярным выражением \D, которое является сокращенным классом символов, который соответствует всем не цифрам:

myString = myString.replace(/\D/g,'');
ПСИ
источник
5
Спасибо csj; Где найти больше информации \D?
p.campbell
34
Это моя ссылка на регулярное выражение по умолчанию: регулярные выражения.info/reference.html Каждый из встроенных классов символов имеет встроенные дополнения. \ d \ D (цифры против всего, кроме цифр) \ w \ W (символы слов против всего, кроме символов слов) \ s \ S (пробелы против всего, кроме пробелов)
csj
3
Просто для ясности, вот синтаксис для replace: w3schools.com/jsref/jsref_obj_regexp.asp, потому что косая черта и «g» являются частью этой команды, а не частью RegEx.
Майк К
делает replaceработу с этим точным синтаксисом во всех браузерах? кажется, я помню, как получал object has no method 'replace' в более старой версии IE, когда использовал это с текстом, который я взял с помощью jQuery ... или что-то в этом роде.
cwd
@cwd Я понятия не имею, что поддерживалось в прошлых или текущих браузерах. В этом вопросе был задан контекст, не относящийся к DOM, поэтому вполне вероятно, что автор создавал сценарии в среде без веб-браузера.
csj
355

Если вам нужно это оставить точку для чисел с плавающей точкой, используйте это

var s = "-12345.50 €".replace(/[^\d.-]/g, ''); // gives "-12345.50"
max4ever
источник
6
Есть эксперты по регулярным выражениям? Как сделать так, чтобы разрешить только одну точку (очень актуально с числами). Спасибо!
Каспери
1
что вы имеете в виду? приведите пример ввода и вывода
max4ever
2
Не хорошо: "aaa 2.9px of bbb.".replace(/[^\d.-]/g, '')2.9.Следует удалить любую строку, которая может окружать число ..
vsync
2
@ max4ever, ты спас мне жизнь, спасибо за обработку -(отрицательного) числа :)
Pankaj Parkar
4
@Kasperi возможно:parseFloat("-1234.5.50 €".replace(/[^\d.-]/g, ''))
A. Genedy
50

Используйте регулярное выражение, если ваша реализация скрипта поддерживает их. Что-то вроде:

myString.replace(/[^0-9]/g, '');
Auraseer
источник
12
По некоторым причинам этот способ кажется намного более читабельным, чем [^ \ d].
Арман Биматов
1
что за g после разделителя регулярных выражений ??
Родной кодер
3
@NativeCoder stackoverflow.com/questions/12993629/…
RagnaRock
23

Вы можете использовать RegExp для замены всех нецифровых символов:

var myString = 'abc123.8<blah>';
myString = myString.replace(/[^\d]/g, ''); // 1238
CMS
источник
22

Что-то вроде:

yourString = yourString.replace ( /[^0-9]/g, '' );
Ян Ханчич
источник
10
Не совсем ответ на оригинальный вопрос, но версия для обработки десятичной точки:yourString = yourString.replace ( /[^0-9.]/g, '' );
Максим Май
0

В Angular / Ionic / VueJS - я только что предложил простой метод:

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

Использование по мнению:

<a [href]="'tel:'+stripNaN(single.meta['phone'])" [innerHTML]="stripNaN(single.meta['phone'])"></a>
Грант
источник
0

К сожалению, ни один из ответов выше не помог мне.

Я искал, чтобы преобразовать номера валют из строк, таких как $123,232,122.11(1232332122.11) или USD 123,122.892(123122.892), или из любой валюты, например ₹ 98,79,112.50(9879112.5), чтобы получить вывод числа, включая десятичный указатель.

Пришлось сделать свое собственное регулярное выражение, которое выглядит примерно так:

str = str.match(/\d|\./g).join('');
Хаос Легион
источник
0

Короткая функция для удаления всех нечисловых символов, но с сохранением десятичного числа (и возврата числа):

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

jackosaur
источник
-5

мы в 2017 году теперь вы также можете использовать ES2016

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

или

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

Результат

1238
Фрэнк Вишневски
источник
12
Это очень неэффективный способ выполнить эту операцию.
Джеру
что неэффективно или плохо здесь?
Владислав Костенко
5
Он преобразует строку в массив односимвольных строк с помощью запасного метода, а затем применяет функцию фильтрации по JavaScript к каждому элементу массива, возвращая новый строковый массив, чтобы, наконец, объединить этот массив обратно в строку. Regex принимает строку и возвращает строку, а обработка выполняется с помощью собственного кода.
ShortFuse