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?

Malcolm
fonte

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.

meder omuraliev
fonte
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)

CMS
fonte
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 .

Chen Dachao
fonte
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

Iván Martínez
fonte
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
Andrew Moore
fonte
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.

Pete Jordan
fonte
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
var result = input.match(/\d+/g).join([])
PavelGora
fonte
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
jamess
fonte
2

Usando split e regex:

    var str = "fooBar0123".split(/(\d+)/);
    console.log(str[0]); // fooBar
    console.log(str[1]); // 0123
SridharKritha
fonte
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('')

Marcelo Viana
fonte
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.

qristjan
fonte
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
Frager.
fonte