Стріпте всі нечислові символи з рядка в JavaScript


701

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

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

//desired output is 1238

Як би ви цього домоглися в простому JavaScript? Пам'ятайте, що це сценарій, що не стосується DOM, тому jQuery та інші рішення, що стосуються подій браузера та натискання клавіш, не підходять.

Відповіді:


1431

Використовуйте .replaceметод рядка з регулярним виразом \D, який є скороченим класом символів, який відповідає всім нецифровим цифрам:

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

5
Спасибі csj; в будь-якому місці, щоб знайти більше інформації про \D?
p.campbell

34
Це моя посилання на регулярні виразки : regular-expressions.info/reference.html У вбудованих класах символів кожен має вбудовані доповнення. \ d \ D (цифри проти всього, крім цифр) \ w \ W (діаграми слів проти всього, крім символів слова) \ s \ S (пробіл проти всього, окрім пробілів)
csj

3
Щоб було зрозуміло, ось синтаксис заміни: 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"

6
Будь-які фахівці з регулярного генерування? Як зробити це, дозволяється лише одна крапка (дуже актуальна для чисел). Дякую!
Каспер

1
Що ви маєте на увазі? наведіть приклад введення та виведення
max4ever

2
Непогано: "aaa 2.9px of bbb.".replace(/[^\d.-]/g, '')2.9.Чи слід
викреслити

2
@ max4 будь-хто ти врятував мені життя, дякую за обробку -(негативну) кількість випадків :)
Pankaj Parkar

4
@Kasperi можливо:parseFloat("-1234.5.50 €".replace(/[^\d.-]/g, ''))
А. Генеді

50

Використовуйте регулярний вираз, якщо ваша реалізація сценарію підтримує їх. Щось на зразок:

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

12
Чомусь цей спосіб здається набагато більш читабельним, ніж [^ \ d].
Арман Біматов

1
для чого після розділового відриву ??
Рідний кодер


23

Ви можете використовувати RegExp для заміни всіх нецифрових символів:

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

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


-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
Це дуже неефективний спосіб зробити цю операцію.
djheru

що тут неефективно чи погано?
Владислав Костенко

5
Він перетворює рядок у масив односимвольних рядків за допомогою запасного методу, а потім застосовує функцію фільтра через JavaScript до кожного елемента масиву, повертаючи новий масив рядків, щоб нарешті приєднати цей масив назад до рядка. Regex бере рядок і повертає рядок, а обробка проводиться за допомогою рідного коду.
ShortFuse
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.