Regex utilisant javascript pour renvoyer uniquement des nombres

129

Si j'ai une chaîne comme "something12" ou "something102", comment utiliserais-je une expression régulière en javascript pour renvoyer uniquement les parties numériques?

Malcolm
la source

Réponses:

226

Expressions régulières:

var numberPattern = /\d+/g;

'something102asdfkj1948948'.match( numberPattern )

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

Pour les concaténer:

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

En supposant que vous n'ayez pas affaire à des nombres décimaux complexes, cela devrait suffire, je suppose.

meder omuraliev
la source
3
se tromper. déteste être pointilleux, mais cela renvoie un tableau, pas un objet (au moins en chrome).
Maus
14
Tous les tableaux sont des objets, non?
meder omuraliev
6
@MuhammadUmer - l'avez-vous essayé?
meder omuraliev
2
@Onza vous manque la barre oblique inverse avant le d, alors.match(/\d+/g)
meder omuraliev
10
@MuhammadUmer, @meder: Vous deux devriez unir vos forces: parseInt('987d98sf79s7f9s8f9sf'.match(/\d+/gi).join(''))
Joisey Mike
199

Vous pouvez également supprimer tous les caractères non numériques ( \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
la source
Eh bien, sauf que l'OP veut "juste le nombre de parties", pas la chaîne.
Scott Fraley
24

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

 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: - 7/9/2018

Nous avons trouvé un outil qui vous permet de modifier visuellement des expressions régulières: JavaScript Regular Expression Parser & Visualizer .

Mettre à jour:

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

Mettre à jour:

Un autre: RegExr .

Mettre à jour:

Regexper et Regex Pal .

Chen Dachao
la source
Parfait, seule solution qui fonctionne avec les décimales et les nombres négatifs
ArmaGeddON
17

Si vous ne voulez que 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

Iván Martínez
la source
9

Je suppose que vous voulez obtenir le (s) nombre (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
Andrew Moore
la source
1
Juste pour que ce soit clair, get_numbers/1renvoie un tableau de chaîne, pas un nombre. Pour votre exemple, il renverrait: * ["102"]* ["102", "12"]* null
Sơn Trần-Nguyễn
2

Les réponses données ne correspondent pas réellement à votre question, ce qui impliquait un numéro de fin . Souvenez-vous également que vous récupérez une chaîne; si vous avez réellement besoin d' un nombre, lancez le résultat:

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

Si vous avez affaire à des identifiants d'éléments numériques sur une page Web, votre code pourrait également accepter utilement an Element, en extrayant le numéro de son id(ou de son premier parent avec un id); si vous en avez un à Eventportée de main, vous pouvez probablement l'obtenir Elementaussi.

Pete Jordan
la source
Bien que ce soit une réponse astucieuse, je ne pense pas que les autres réponses "ne correspondent pas réellement à [la] question". En fait, les autres réponses sont plus polyvalentes. Ils travailleront avec des nombres de fin ainsi que des nombres au milieu. Il est un peu présomptueux de supposer que l'OP voulait qu'il fonctionne UNIQUEMENT avec des nombres de fin.
Xandor
2
var result = input.match(/\d+/g).join([])
PavelGora
la source
2

OMI, la réponse n ° 3 à l'heure actuelle par Chen Dachao est la bonne voie à suivre si vous souhaitez capturer n'importe quel type de nombre, mais l'expression régulière peut être raccourcie à partir de:

/[-]{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 massacré un exemple de gradient linéaire MDN afin qu'il teste complètement l'expression rationnelle et n'ait pas besoin de faire défiler ici. Je pense avoir inclus toutes les possibilités en termes de nombres négatifs, décimales, suffixes d'unité comme deg et%, utilisation incohérente de virgule et d'espace, et les caractères supplémentaires point / point et tiret / tiret 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 est un nombre décimal mal formé comme "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, n'a pas besoin de s'inquiéter de l'utilisation non numérique du caractère point / point, donc l'expression régulière peut être encore plus simple:

/-?[\d\.]+/g
jamess
la source
2

Utilisation de split et regex:

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

Selon la réponse de @ Syntle, si vous n'avez que des caractères non numériques, vous obtiendrez un Uncaught TypeError: Cannot read property 'join' of null.

Cela évitera les erreurs si aucune correspondance n'est trouvée et renvoie une chaîne vide:

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

Marcelo Viana
la source
0

Si vous voulez également des nombres séparés par des points / virgules, alors:

\d*\.?\d*

ou

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

Vous pouvez utiliser https://regex101.com/ pour tester vos expressions régulières.

Qristjan
la source
0

Tout ce que les autres solutions ont, mais avec un peu de 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
Frager.
la source