Tira todos os caracteres não numéricos da string em JavaScript

701

Considere um cenário não DOM, no qual você deseja remover todos os caracteres não numéricos de uma sequência usando JavaScript / ECMAScript. Quaisquer caracteres que estejam dentro do alcance 0 - 9devem ser mantidos.

var myString = 'abc123.8<blah>';

//desired output is 1238

Como você conseguiria isso em JavaScript simples? Lembre-se de que este é um cenário que não é do DOM; portanto, o jQuery e outras soluções que envolvem eventos do navegador e do pressionamento de tecla não são adequados.

p.campbell
fonte

Respostas:

1431

Use o .replacemétodo da string com um regex de \D, que é uma classe de caracteres abreviados que corresponde a todos os que não são dígitos:

myString = myString.replace(/\D/g,'');
csj
fonte
5
Obrigado csj; em qualquer lugar para encontrar mais informações \D?
P.campbell 07/12/2009
34
Esta é minha referência de regex padrão: regular-expressions.info/reference.html As classes de caracteres internas possuem complementos internos. \ d \ D (dígitos contra tudo, mas dígitos) (charcters palavra contra tudo mas palavra caracteres) \ w \ W \ s \ S (espaços em branco contra tudo, mas os espaços em branco)
csj
3
Só para esclarecer, eis a sintaxe para substituir: w3schools.com/jsref/jsref_obj_regexp.asp porque as barras e o "g" fazem parte desse comando, não fazem parte do RegEx.
Mike K
faz replacetrabalho com esta sintaxe exata em todos os navegadores? parece que me lembro de ter conseguido uma object has no method 'replace' versão mais antiga do IE ao usá-la com o texto que peguei no jQuery ... ou algo assim.
Cwd
@cwd Não tenho idéia do que é suportado em navegadores anteriores ou atuais. A pergunta especificou um contexto não DOM, portanto, é provável que o pôster estivesse em script em um ambiente que não seja um navegador da Web.
Csj
354

Se você precisar deixar o ponto para números flutuantes, use este

var s = "-12345.50 €".replace(/[^\d.-]/g, ''); // gives "-12345.50"
max4ever
fonte
6
Algum especialista em regexp? Como fazer isso permitir apenas um único ponto (muito relevante com números). Obrigado!
Kasperi
1
O que você quer dizer? dar exemplo de entrada e saída
max4ever 23/10
2
Não é bom: "aaa 2.9px of bbb.".replace(/[^\d.-]/g, '')2.9.Deve remover qualquer String que possa envolver um número ..
vsync
2
@ max4ever você salvou minha vida, obrigado por manipulação -(negativo) caso o número :)
Pankaj Parkar
4
@ Kasperi talvez:parseFloat("-1234.5.50 €".replace(/[^\d.-]/g, ''))
A. Genedy 10/02
50

Use uma expressão regular, se sua implementação de script os suportar. Algo como:

myString.replace(/[^0-9]/g, '');
Auraseer
fonte
12
Por alguma razão, esse caminho parece muito mais legível que [^ \ d].
Arman Bimatov
1
qual é o g depois do delimitador regex ??
Native Coder
3
@NativeCoder stackoverflow.com/questions/12993629/…
RagnaRock 10/17/17 /
23

Você pode usar um RegExp para substituir todos os caracteres que não são dígitos:

var myString = 'abc123.8<blah>';
myString = myString.replace(/[^\d]/g, ''); // 1238
CMS
fonte
22

Algo ao longo das linhas de:

yourString = yourString.replace ( /[^0-9]/g, '' );
Jan Hančič
fonte
10
Não é exatamente uma resposta para a pergunta original, mas uma versão para manipular o ponto decimal:yourString = yourString.replace ( /[^0-9.]/g, '' );
Maxim Mai
0

tentar

myString.match(/\d/g).join``

Kamil Kiełczewski
fonte
0

Em Angular / Ionic / VueJS - acabei de criar um método simples de:

stripNaN(txt: any) {
    return txt.toString().replace(/[^a-zA-Z0-9]/g, "");
}

Uso na exibição:

<a [href]="'tel:'+stripNaN(single.meta['phone'])" [innerHTML]="stripNaN(single.meta['phone'])"></a>
Conceder
fonte
0

Infelizmente, nenhuma das respostas acima funcionou para mim.

Eu estava olhando para converter números de moeda de seqüências de caracteres como $123,232,122.11(1232332122.11) ou USD 123,122.892(123122.892) ou qualquer moeda como ₹ 98,79,112.50(9879112.5) para me dar uma saída de número, incluindo o ponteiro decimal.

Tive que fazer meu próprio regex que se parece com isso:

str = str.match(/\d|\./g).join('');
Legião do Caos
fonte
0

Função curta para remover todos os caracteres não numéricos, mas manter o decimal (e retornar o número):

parseNum = str => +str.replace(/[^.\d]/g, '');
let str = 'a1b2c.d3e';
console.log(parseNum(str));

jackosaur
fonte
-5

estamos em 2017 agora você também pode usar o ES2016

var a = 'abc123.8<blah>';
console.log([...a].filter( e => isFinite(e)).join(''));

ou

console.log([...'abc123.8<blah>'].filter( e => isFinite(e)).join(''));  

O resultado é

1238
Frank Wisniewski
fonte
12
Esta é uma maneira muito ineficiente de executar esta operação.
djheru
o que é ineficiente ou ruim aqui?
Vladislav Kostenko 14/11
5
Ele converte a cadeia de caracteres em uma matriz de cadeias de caracteres únicos por meio de um método sobressalente e aplica a função de filtro sobre JavaScript em cada item da matriz, retornando uma nova matriz de cadeias, para finalmente ingressar na matriz novamente. Regex pega uma string e retorna uma string e o processamento é feito via código nativo.
ShortFuse