Réponses:
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.
d
, alors.match(/\d+/g)
parseInt('987d98sf79s7f9s8f9sf'.match(/\d+/gi).join(''))
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)
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:
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
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
get_numbers/1
renvoie un tableau de chaîne, pas un nombre. Pour votre exemple, il renverrait: * ["102"]
* ["102", "12"]
* null
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 à Event
portée de main, vous pouvez probablement l'obtenir Element
aussi.
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
Utilisation de split et regex:
var str = "fooBar0123".split(/(\d+)/);
console.log(str[0]); // fooBar
console.log(str[1]); // 0123
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('')
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.
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