Regex usando javascript para retornar apenas números


129

Se eu tiver uma string como "something12" ou "something102", como eu usaria uma regex em javascript para retornar apenas as partes numéricas?

Respostas:


226

Expressões regulares:

var numberPattern = /\d+/g;

'something102asdfkj1948948'.match( numberPattern )

Isso retornaria uma matriz com dois elementos internos, '102' e '1948948'. Opere como desejar. Se não corresponder a nenhum, retornará nulo.

Para concatená-los:

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

Supondo que você não esteja lidando com decimais complexos, isso deve bastar, suponho.


3
errar. odeio ser exigente, mas isso retorna uma matriz, não um objeto (pelo menos no chrome).
Maus

14
Todas as matrizes são objetos, não?
meder omuraliev

6
@MuhammadUmer - você tentou?
Meder omuraliev

2
@Onza que está faltando a barra invertida antes do d, então.match(/\d+/g)
meder omuraliev

10
@MuhammadUmer, @meder: Vocês dois devem combinar forças: parseInt('987d98sf79s7f9s8f9sf'.match(/\d+/gi).join(''))
Joisey Mike 12/17/17

199

Você também pode remover todos os caracteres que não são dígitos ( \Dou [^0-9]):

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

console.log(word_Without_Numbers)


Bem, exceto que o OP quer "apenas o número de partes", não a string.
Scott Fraley

24

Para número com fração decimal e sinal de menos, eu uso este trecho:

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

Atualização: - 09/07/2018

Encontrou uma ferramenta que permite editar visualmente expressões regulares: JavaScript Regular Expression Parser & Visualizer .

Atualizar:

Aqui está outro com o qual você pode até depurar o regexp: testador e depurador online de regex .

Atualizar:

Outro: RegExr .

Atualizar:

Regexper e Regex Pal .


Solução perfeita, única que funciona com números decimais e números negativos
ArmaGeddON

17

Se você deseja apenas dígitos:

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

Agora você junta os dígitos


9

Eu acho que você deseja obter números da string. Nesse caso, você pode usar o seguinte:

// 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
Apenas para esclarecer, get_numbers/1retorna uma matriz de string, não número. Para seu exemplo, ele retornaria: * ["102"]* ["102", "12"]* null
Sén Trần-Nguyễn

2

As respostas dadas não correspondem à sua pergunta, o que implicava um número final . Além disso, lembre-se de que você está recebendo uma string de volta; se você realmente precisa de um número, transmita o resultado:

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

Se você estiver lidando com IDs de itens numéricos em uma página da Web, seu código também poderá aceitar um Elementextraindo o número dele id(ou seu primeiro pai com um id); se você for Eventútil, provavelmente também poderá tirar Elementproveito disso.


Embora essa seja uma resposta bacana, não acho que as outras respostas "não correspondam à pergunta". De fato, as outras respostas são mais versáteis. Eles trabalharão com números finais, bem como números no meio. É um pouco presunçoso supor que o OP queria SÓ trabalhar com números finais.
Xandor 03/11/19


2

Na IMO, a resposta nº 3 de Chen Dachao neste momento é o caminho certo a seguir, se você deseja capturar qualquer tipo de número, mas a expressão regular pode ser abreviada de:

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

para:

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

Por exemplo, este código:

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

gera esta matriz:

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

Eu massacrei um exemplo de gradiente linear MDN para que ele teste totalmente a regexp e não precise rolar aqui. Acho que incluí todas as possibilidades em termos de números negativos, decimais, sufixos de unidade como deg e%, vírgula inconsistente e uso de espaço e os caracteres extras de ponto / período e hífen / hífen no texto "lin-grad.ient " Por favor, deixe-me saber se estou faltando alguma coisa. A única coisa que vejo que ele não lida com um número decimal mal formado como "0..8".

Se você realmente deseja uma matriz de números, pode converter a matriz inteira na mesma linha de código:

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

Meu código específico, que está analisando funções CSS, não precisa se preocupar com o uso não numérico do caractere ponto / ponto, para que a expressão regular possa ser ainda mais simples:

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

2

Usando split e regex:

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

1

De acordo com a resposta do @ Syntle, se você tiver apenas caracteres não numéricos, receberá um Uncaught TypeError: Cannot read property 'join' of null.

Isso evitará erros se nenhuma correspondência for encontrada e retornará uma string vazia:

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


0

Se você quiser números separados por pontos / vírgulas também:

\d*\.?\d*

ou

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

Você pode usar https://regex101.com/ para testar suas regexes.


0

Tudo o que outras soluções possuem, mas com um pouco de validação

// 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.