194

If I have a string like "something12" or "something102", how would I use a regex in javascript to return just the number parts?

15 Answers 15

309

Regular expressions:

var numberPattern = /\d+/g;

'something102asdfkj1948948'.match( numberPattern )

This would return an Array with two elements inside, '102' and '1948948'. Operate as you wish. If it doesn't match any it will return null.

To concatenate them:

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

Assuming you're not dealing with complex decimals, this should suffice I suppose.

Sign up to request clarification or add additional context in comments.

10 Comments

err. hate to be nit-picky, but this returns an array, not an object (at least in chrome).
All arrays are objects though, no?
@MuhammadUmer - did you try it?
@Onza you are missing the backslash before the d, so .match(/\d+/g)
@MuhammadUmer, @meder: You two should combine forces: parseInt('987d98sf79s7f9s8f9sf'.match(/\d+/gi).join(''))
|
240

You could also strip all the non-digit characters (\D or [^0-9]):

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

console.log(numbers)

3 Comments

Well, except that the OP wants "just the number parts," not the string.
@ScottFraley note that this code uses the replace method, not the match method ;)
doesn't work with decimals. It should preserve the decimal too
51

For number with decimal fraction and minus sign, I use this snippet:

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

const numbers = '2.2px -6,543.1px 4px -7.6px obj.key'.match(NUMERIC_REGEXP)

console.log(numbers); // ["2.2", "3.1", "4", "-7.6"]

Update: - 7/9/2018

Found a tool which allows you to edit regular expression visually: JavaScript Regular Expression Parser & Visualizer.

Update:

Here's another one with which you can even debugger regexp: Online regex tester and debugger.

Update:

Another one: RegExr.

Update:

Regexper and Regex Pal.

3 Comments

Perfect, only solution that works with decimals and negative nums
doesn't work with comma as digit separator
@ishandutta2007, try with the latest regular expression
19

If you want only digits:

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

Now you get the digits joined

Comments

11

I guess you want to get number(s) from the string. In which case, you can use the following:

// 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 Comment

Just to make it clear, get_numbers/1 returns an array of string, not number. For your example, it would return: * ["102"] * ["102", "12"] * null
7

IMO the #3 answer at this time by Chen Dachao is the right way to go if you want to capture any kind of number, but the regular expression can be shortened from:

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

to:

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

For example, this code:

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

generates this array:

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

I've butchered an MDN linear gradient example so that it fully tests the regexp and doesn't need to scroll here. I think I've included all the possibilities in terms of negative numbers, decimals, unit suffixes like deg and %, inconsistent comma and space usage, and the extra dot/period and hyphen/dash characters within the text "lin-grad.ient". Please let me know if I'm missing something. The only thing I can see that it does not handle is a badly formed decimal number like "0..8".

If you really want an array of numbers, you can convert the entire array in the same line of code:

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

My particular code, which is parsing CSS functions, doesn't need to worry about the non-numeric use of the dot/period character, so the regular expression can be even simpler:

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

Comments

4
var result = input.match(/\d+/g).join([])

Comments

4

Using split and regex :

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

Comments

2

The answers given don't actually match your question, which implied a trailing number. Also, remember that you're getting a string back; if you actually need a number, cast the result:

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

If you're dealing with numeric item ids on a web page, your code could also usefully accept an Element, extracting the number from its id (or its first parent with an id); if you've an Event handy, you can likely get the Element from that, too.

1 Comment

While this is a nifty answer I do not think that the other answers "don't actually match [the] question". In fact the other answers are more versatile. They will work with trailing numbers as well as numbers in the middle. It is a bit presumptuous to assume the OP wanted it to ONLY work with trailing numbers.
2

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

const numbers = '2.2px 3.1px 4px -7.6px obj.key'.match(NUMERIC_REGEXP)

console.log(numbers); // ["2.2", "3.1", "4", "-7.6"]

Chen Dachao answer is perfect. Same, but a little shorter

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

1 Comment

you could just comment your opinion to prevent repetition.
1

As per @Syntle's answer, if you have only non numeric characters you'll get an Uncaught TypeError: Cannot read property 'join' of null.

This will prevent errors if no matches are found and return an empty string:

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

Comments

1

Here is the solution to convert the string to valid plain or decimal numbers using Regex:

//something123.777.321something to 123.777321
const str = 'something123.777.321something';
let initialValue = str.replace(/[^0-9.]+/, '');
//initialValue = '123.777.321';

//characterCount just count the characters in a given string
if (characterCount(intitialValue, '.') > 1) {
 const splitedValue = intitialValue.split('.');
 //splittedValue = ['123','777','321'];
 intitialValue = splitedValue.shift() + '.' + splitedValue.join('');
 //result i.e. initialValue = '123.777321'
}

Comments

0

If you want dot/comma separated numbers also, then:

\d*\.?\d*

or

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

You can use https://regex101.com/ to test your regexes.

Comments

0

Everything that other solutions have, but with a little validation

// 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

Comments

0

One liner

I you do not care about decimal numbers and only need the digits, I think this one liner is rather elegant:

/**
 * @param {String} str
 * @returns {String} - All digits from the given `str`
 */
const getDigitsInString = (str) => str.replace(/[^\d]*/g, '');

console.log([
  '?,!_:/42\`"^',
  'A 0 B 1 C 2 D 3 E',
  ' 4 twenty 20 ',
  '1413/12/11',
  '16:20:42:01'
].map((str) => getDigitsInString(str)));

Simple explanation:

  • \d matches any digit from 0 to 9
  • [^n] matches anything that is not n
  • * matches 0 times or more the predecessor ( It is an attempt to match a whole block of non-digits all at once )
  • g at the end, indicates that the regex is global to the entire string and that we will not stop at the first occurrence but match every occurrence within it

Together those rules match anything but digits, which we replace by an empty strings. Thus, resulting in a string containing digits only.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.