Regex за допомогою javascript повертає просто цифри


129

Якщо у мене є рядок на кшталт "something12" або "something102", як би я використовував регулярний вираз в JavaScript для повернення лише частин числа?

Відповіді:


226

Регулярні вирази:

var numberPattern = /\d+/g;

'something102asdfkj1948948'.match( numberPattern )

Це поверне масив з двома елементами всередині, "102" та "1948948". Дійте, як хочете. Якщо він не відповідає жодному, він повернеться до нуля.

Щоб об'єднати їх:

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

Якщо припустити, що ви не маєте справу зі складними десятковими знаками, то, мабуть, цього має вистачити.


3
помилятися Ненавиджу бути вибагливим, але це повертає масив, а не об’єкт (принаймні, у хромі).
Маус

14
Хоча всі масиви є об’єктами, ні?
meder omuraliev

6
@MuhammadUmer - ти пробував?
meder omuraliev

2
@Onza вам не вистачає зворотної косої риски перед d, тому.match(/\d+/g)
meder omuraliev

10
@MuhammadUmer, @meder: Ви двоє повинні об'єднати сили: parseInt('987d98sf79s7f9s8f9sf'.match(/\d+/gi).join(''))
Joisey Mike

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)


Ну, за винятком того, що ОП хоче "просто кількість частин", а не рядок.
Скотт

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"]

Оновлення: - 9.07.2018

Знайдено інструмент, який дозволяє візуально редагувати регулярні вирази: JavaScript Regular Expression Parser & Visualizer .

Оновлення:

Ось ще один, за допомогою якого ви навіть можете налагодити regexp: Інтернет тестер regex та налагоджувач .

Оновлення:

Ще один: RegExr .

Оновлення:

Regexper і Regex Pal .


Ідеальне, єдине рішення, яке працює з десятковими і від’ємними цифрами
ArmaGeddON

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від цього.


Хоча це чудова відповідь, я не думаю, що інші відповіді "насправді не відповідають [тому] питанню". Насправді інші відповіді більш універсальні. Вони працюватимуть з кінцевими числами, а також з числами в середині. Трохи самонадійно припускати, що ОП хотіла, щоб вона працювала ТІЛЬКИ з кінцевими номерами.
Ксандор


2

На даний момент відповідь ІМО від Chen Dachao - це правильний шлях, якщо ви хочете ввести будь-яке число, але регулярний вираз можна скоротити з:

/[-]{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-grad.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.