Regex с использованием javascript для возврата только чисел


129

Если у меня есть строка типа «something12» или «something102», как мне использовать регулярное выражение в javascript, чтобы вернуть только части числа?

Ответы:


226

Регулярные выражения:

var numberPattern = /\d+/g;

'something102asdfkj1948948'.match( numberPattern )

Это вернет массив с двумя элементами внутри: «102» и «1948948». Действуйте как хотите. Если он не соответствует ни одному, он вернет null.

Чтобы объединить их:

'something102asdfkj1948948'.match( numberPattern ).join('')

Предполагая, что вы не имеете дело со сложными десятичными знаками, я полагаю, этого должно быть достаточно.


3
эээ. не хочу быть придирчивым, но это возвращает массив, а не объект (по крайней мере, в хроме).
Maus

14
Но ведь все массивы - объекты, не так ли?
медер омуралиев 05

6
@MuhammadUmer - ты пробовал?
медер омуралиев 05

2
@Onza, у вас отсутствует обратная косая черта перед d, поэтому.match(/\d+/g)
медер омуралиев

10
@MuhammadUmer, @meder: Вы двое должны объединить силы: parseInt('987d98sf79s7f9s8f9sf'.match(/\d+/gi).join(''))
Джойси Майк,

199

Вы также можете удалить все нецифровые символы ( \Dили [^0-9]):

let word_With_Numbers = 'abc123c def4567hij89'
let word_Without_Numbers = word_With_Numbers.replace(/\D/g, '');

console.log(word_Without_Numbers)


Ну, за исключением того, что OP хочет «только числовые части», а не строку.
Скотт Фрейли

24

Для числа с десятичной дробью и знаком минус я использую этот фрагмент:

 var NUMERIC_REGEXP = /[-]{0,1}[\d]*[.]{0,1}[\d]+/g;

'2.2px 3.1px 4px -7.6px obj.key'.match(NUMERIC_REGEXP)
// return ["2.2", "3.1", "4", "-7.6"]

Обновление: - 09.07.2018

Нашел инструмент, позволяющий визуально редактировать регулярные выражения: Анализатор и Визуализатор регулярных выражений JavaScript .

Обновить:

Вот еще один, с помощью которого вы можете даже отладить регулярное выражение: онлайн-тестер и отладчик регулярных выражений .

Обновить:

Еще один: RegExr .

Обновить:

Regexper и Regex Pal .


Идеальное, единственное решение, которое работает с десятичными знаками и отрицательными
числами

17

Если вам нужны только цифры:

var value = '675-805-714';
var numberPattern = /\d+/g;
value = value.match( numberPattern ).join([]);
alert(value);
//Show: 675805714

Теперь вы соединяете цифры


9

Я думаю, вы хотите получить число (а) из строки. В этом случае вы можете использовать следующее:

// Returns an array of numbers located in the string
function get_numbers(input) {
    return input.match(/[0-9]+/g);
}

var first_test = get_numbers('something102');
var second_test = get_numbers('something102or12');
var third_test = get_numbers('no numbers here!');

alert(first_test); // [102]
alert(second_test); // [102,12]
alert(third_test); // null

1
Чтобы было понятно, get_numbers/1возвращает массив строки, а не числа. В вашем примере он вернет: * ["102"]* ["102", "12"]* null
Sơn Trần-Nguyễn

2

Приведенные ответы на самом деле не соответствуют вашему вопросу, что подразумевает конечный номер. Также помните, что вы получаете обратно строку; если вам действительно нужно число, приведите результат:

item=item.replace('^.*\D(\d*)$', '$1');
if (!/^\d+$/.test(item)) throw 'parse error: number not found';
item=Number(item);

Если вы имеете дело с числовыми идентификаторами элементов на веб-странице, ваш код также может с пользой принять Element, извлекая число из его id(или его первого родителя с символом id); если у вас есть под Eventрукой, вы, вероятно Element, тоже можете получить от него.


Хотя это отличный ответ, я не думаю, что другие ответы «на самом деле не соответствуют [вопросу]». На самом деле другие ответы более разнообразны. Они будут работать как с числами в конце, так и с числами в середине. Немного самонадеянно предполагать, что OP хотел, чтобы он работал ТОЛЬКО с конечными числами.
Xandor 03


2

ИМО, ответ №3 на данный момент Чен Дачао - правильный путь, если вы хотите захватить любое число, но регулярное выражение можно сократить от:

/[-]{0,1}[\d]*[\.]{0,1}[\d]+/g

чтобы:

/-?\d*\.?\d+/g

Например, такой код:

"lin-grad.ient(217deg,rgba(255, 0, 0, -0.8), rgba(-255,0,0,0) 70.71%)".match(/-?\d*\.?\d+/g)

генерирует этот массив:

["217","255","0","0","-0.8","-255","0","0","0","70.71"]

Я вырезал пример линейного градиента MDN, чтобы он полностью тестировал регулярное выражение и не нужно было здесь прокручивать. Я думаю, что я включил все возможности с точки зрения отрицательных чисел, десятичных знаков, суффиксов единиц измерения, таких как deg и%, несогласованного использования запятой и пробела, а также дополнительных символов точки / точки и дефиса / тире в тексте "lin-gradient.ient" ». Пожалуйста, дайте мне знать, если я что-то упускаю. Единственное, что я вижу, что он не обрабатывает, - это неправильно сформированное десятичное число, такое как "0..8".

Если вам действительно нужен массив чисел, вы можете преобразовать весь массив в той же строке кода:

array = whatever.match(/-?\d*\.?\d+/g).map(Number);

Мой конкретный код, который анализирует функции CSS, не должен беспокоиться о нечисловом использовании символа точки / точки, поэтому регулярное выражение может быть еще проще:

/-?[\d\.]+/g

2

Использование разделения и регулярного выражения:

    var str = "fooBar0123".split(/(\d+)/);
    console.log(str[0]); // fooBar
    console.log(str[1]); // 0123

1

Согласно ответу @Syntle, если у вас есть только нечисловые символы, вы получите файл Uncaught TypeError: Cannot read property 'join' of null.

Это предотвратит ошибки, если совпадения не найдены, и вернет пустую строку:

('something'.match( /\d+/g )||[]).join('')


0

Если вам нужны числа, разделенные точкой / запятой, тогда:

\d*\.?\d*

или

[0-9]*\.?[0-9]*

Вы можете использовать https://regex101.com/ для проверки своих регулярных выражений.


0

Все, что есть в других решениях, но с небольшой проверкой

// value = '675-805-714'
const validateNumberInput = (value) => { 
    let numberPattern = /\d+/g 
    let numbers = value.match(numberPattern)

    if (numbers === null) {
        return 0
    }  

    return parseInt(numbers.join([]))
}
// 675805714
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.