web-dev-qa-db-fra.com

Regex utilisant javascript pour ne renvoyer que des chiffres

Si j'ai une chaîne comme "quelque chose de 12" ou "quelque chose de 102", comment pourrais-je utiliser une expression régulière en javascript pour renvoyer uniquement les nombres?

105
Malcolm

Expressions régulières:

var numberPattern = /\d+/g;

'something102asdfkj1948948'.match( numberPattern )

Cela renverrait un objet avec deux éléments à l'intérieur, '102' et '1948948'. Opérez comme vous le souhaitez. S'il ne correspond à aucun, il retournera null.

En supposant que vous ne traitiez pas de nombres décimaux complexes, cela devrait suffire, je suppose.

170
meder omuraliev

Vous pouvez également supprimer tous les caractères non numériques (\D ou [^0-9]):

let Word_With_Numbers = 'abc123c def4567hij89'
let Word_Without_Numbers = Word_With_Numbers.replace(/\D/g, '');

console.log(Word_Without_Numbers)

169
CMS

Pour les nombres avec fraction décimale et signe moins, j'utilise cet extrait:

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

Mise à jour: - 09/07/2018

Vous avez trouvé un outil qui vous permet de modifier visuellement une expression régulière: JavaScript Parser & Visualizer - Regular Expression JavaScript.

Mettre à jour:

En voici un autre avec lequel vous pouvez même déboguer une expression rationnelle: Testeur de regex en ligne et débogueur.

Mettre à jour:

Un autre: RegExr.

Mettre à jour:

Regexper et Regex Pal.

19
Chen Dachao

Si vous voulez seulement des chiffres:

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

Maintenant, vous obtenez les chiffres joints

12
Iván Martínez

Je suppose que vous voulez obtenir le (s) numéro (s) de la chaîne. Dans ce cas, vous pouvez utiliser les éléments suivants:

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

Les réponses données ne correspondent pas vraiment à votre question, ce qui impliquait un nombre trailing. De plus, rappelez-vous que vous récupérez une ficelle; si vous avez besoin un nombre, transformez le résultat:

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

Si vous traitez avec des identifiants d'éléments numériques sur une page Web, votre code pourrait également accepter utilement une Element, en extrayant le nombre de sa id (ou son premier parent avec une id); si vous avez un Event pratique, vous pouvez probablement obtenir le Element à partir de cela aussi.

2
Pete Jordan

La réponse # 3 de l'OMI à ce moment-ci de Chen Dachao est la bonne solution si vous souhaitez capturer tout type de nombre, mais l'expression régulière peut être abrégée:

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

à:

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

Par exemple, ce code:

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

génère ce tableau:

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

J'ai coupé un exemple de dégradé linéaire MDN afin qu'il teste complètement l'expression rationnelle et qu'il ne soit pas nécessaire de le faire défiler ici. Je pense avoir inclus toutes les possibilités en termes de nombres négatifs, de nombres décimaux, de suffixes d'unités comme deg et%, de virgules incohérentes et d'utilisation de l'espace, et des caractères points/points et tirets/tirets supplémentaires dans le texte "lin-grad.ient ". S'il vous plaît laissez-moi savoir si je manque quelque chose. La seule chose que je peux voir qu’il ne gère pas, c’est un nombre décimal mal formé, tel que "0..8".

Si vous voulez vraiment un tableau de nombres, vous pouvez convertir le tableau entier dans la même ligne de code:

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

Mon code particulier, qui analyse les fonctions CSS, ne doit pas s'inquiéter de l'utilisation non numérique du caractère point/point. L'expression régulière peut donc être encore plus simple:

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