Extraire («obtenir») un nombre d'une chaîne


355

J'ai une chaîne en javascript comme `# box2 'et je veux juste le' 2 '.

A essayé:

var thestring = $(this).attr('href');
var thenum = thestring.replace( /(^.+)(\w\d+\w)(.+$)/i,'$2');
alert(thenum);

Il renvoie toujours # box2 dans l'alerte, comment puis-je le faire fonctionner?

Il doit s'adapter à n'importe quel numéro de longueur attaché à l'extrémité.


1
vous pouvez simplement faire comme ça. cela fonctionnera bien. var thestring = $ (this) .attr ('href'); var thenum = parsefloat (la chaîne); alerte (thénum);
Vivek Shukla

1
ce code fonctionne bien pour moi, mais pour un cas, j'ai une chaîne «2,5 / mile» et je veux en extraire 2,5. Le code ci-dessus me donne 25 au lieu de 2,5
Bijay Singh

Réponses:


578

Pour cet exemple spécifique,

 var thenum = thestring.replace( /^\D+/g, ''); // replace all leading non-digits with nothing

dans le cas général:

 thenum = "foo3bar5".match(/\d+/)[0] // "3"

Depuis que cette réponse a gagné en popularité pour une raison quelconque, voici un bonus: générateur de regex.

function getre(str, num) {
  if(str === num) return 'nice try';
  var res = [/^\D+/g,/\D+$/g,/^\D+|\D+$/g,/\D+/g,/\D.*/g, /.*\D/g,/^\D+|\D.*$/g,/.*\D(?=\d)|\D+$/g];
  for(var i = 0; i < res.length; i++)
    if(str.replace(res[i], '') === num) 
      return 'num = str.replace(/' + res[i].source + '/g, "")';
  return 'no idea';
};
function update() {
  $ = function(x) { return document.getElementById(x) };
  var re = getre($('str').value, $('num').value);
  $('re').innerHTML = 'Numex speaks: <code>' + re + '</code>';
}
<p>Hi, I'm Numex, the Number Extractor Oracle.
<p>What is your string? <input id="str" value="42abc"></p>
<p>What number do you want to extract? <input id="num" value="42"></p>
<p><button onclick="update()">Insert Coin</button></p>
<p id="re"></p>


15
-1, "#box2_col3".replace( /^\D+/g, '')aurait dû montrer 2, non 2_col3.
Shiplu Mokaddim

2
@ shiplu.mokadd.im: Je ne vois aucune référence à #box2_col3la question.
georg

1
Oui, il n'y a aucune référence à #box2_col3. Mais voyez l'OP regex utilisé ( \w)(.+$)) qui indique clairement qu'il y a d'autres caractères après le nombre.
Shiplu Mokaddim

3
dans ce cas, votre modèle échoue également s'il y a un nombre avant la fin.
Shiplu Mokaddim

2
Vous pouvez faire replacefonctionner les nombres principaux en utilisant theString.replace(/^.*\D+/g, '');:, mais la solution de shiplu.mokadd.im est meilleure.
LandonSchropp

225

Vous devriez essayer ce qui suit:

var txt = "#div-name-1234-characteristic:561613213213";
var numb = txt.match(/\d/g);
numb = numb.join("");
alert (numb);​

résultat

1234561613213213

1
belle réponse, mais si je veux le jeu de nombres séparément. soit 1234, 5616133 ...
Amar Singh

Ou one-liner + analyse en entier:parseInt(txt.match(/\d/g).join(''), 10)
Lukas Liesis

" $ 20.0 ".match(/\d/g).join('') => "200" (juste en disant)
vsync

91

Je pense que cette expression régulière servira votre objectif:

var num = txt.replace(/[^0-9]/g,'');

txtest ta chaîne.

Il arrache tout ce qui n'est pas un chiffre.

Je pense que vous pouvez réaliser la même chose en utilisant cela aussi:

var num = txt.replace(/\D/g,'');

1
/[^0-9]/g+1 pour la lisibilité. Également utilisé avec la plupart des réponses ici: stackoverflow.com/q/1862130/1066234
Kai Noack

58

Essayez ce qui suit: string.replace(/[^0-9]/g, '');Cela supprimera tous les caractères non numériques, ne laissant que des chiffres dans la chaîne

function retnum(str) { 
    var num = str.replace(/[^0-9]/g, ''); 
    return parseInt(num,10); 
}

console.log('abca12bc45qw'.replace(/[^0-9]/g, ''));
console.log('#box2'.replace(/[^0-9]/g, ''));


2
C'est mieux que la réponse acceptée, car elle remplace tous les non-nombres globalement et btw, /[^0-9]/gpeut être remplacé par /[^\d]/g.
CPHPython

52

Utilisation de la fonction de correspondance.

var thenum = thestring.match(/\d+$/)[0];
alert(thenum);

jsfiddle


1
Vous pouvez également ajouter un «+» unaire pour en faire un entier var thenum = + thestring.match (/ \ d + $ /) [0];
Sergey Onishchenko

Je suppose que cela ne fonctionne pas pour les numéros à> 1 chiffre? (Je comprends que la question était pour les nombres à 1 chiffre, mais je regarde les nombres possibles> 10.)
Felix

@nissemand Ne devinez pas . Essayez-vous. Même vous n'avez pas vu le violon.
Shiplu Mokaddim

Aime ça. Un moyen le plus simple d'extraire le nombre dans une variable sans toucher ou modifier l'élément. J'apprécierais un combo avec chacun pour plusieurs coïncidences à l'intérieur d'une chaîne. c'est-à-dire que la chaîne 12a55 indique le dernier nombre, pas tous.
m3nda

1
@YevgeniyAfanasyev il ne devrait pas. Vérifiez la question d'origine. Surtout la dernière ligne. Le numéro doit être à la fin.
Shiplu Mokaddim

33

J'ai essayé toutes les combinaisons citées ci-dessus avec ce code et je l'ai fait fonctionner, était la seule qui a travaillé sur cette chaîne ->(12) 3456-7890

var str="(12) 3456-7890";
str.replace( /\D+/g, '');

Résultat: "1234567890"

Obs: je sais qu'une chaîne comme ça ne sera pas sur l'attr mais peu importe, la solution est meilleure, car plus complète.


je pense que le mieux sera str.match(/\d+/g).map(Number)qu'il retournera un tableau
Artem Bernatskyi

33

Et ceci est un extrait qui extrait les prix avec la devise et le formatage:

var price = "£1,739.12";
parseFloat(price.replace( /[^\d\.]*/g, '')); // 1739.12

13

vous pouvez utiliser une excellente méthode parseInt

il convertira les premiers chiffres en nombre

parseInt("-10px");
// will give you -10

18
cela ne fonctionne que lorsque le nombre est au début de la chaîne
Russj

2
son retour NaN
Ahmed Syed


4

Vous pouvez utiliser une expression régulière.

var txt="some text 2";
var numb = txt.match(/\d/g);
alert (numb);

Cela alertera 2.


4
-1 plusieurs chiffres ne seront pas capturés et pour l'utilisation du tableau en alerte
Shiplu Mokaddim

4

Avec les expressions régulières , comment obtenir des nombres à partir d'une chaîne, par exemple:

String myString = "my 2 first gifts were made by my 4 brothers";
myString = myString .replaceAll("\\D+","");
System.out.println("myString : " + myString);

le résultat myStringest " 24"

vous pouvez voir un exemple de ce code en cours d'exécution ici: http://ideone.com/iOCf5G


5
java! == javascript - replaceAll n'existe pas en javascript standard. Seules certaines bibliothèques comme jQuery ont cette méthode. À l'avenir, vous devriez clarifier.
Levi Roberts

3

Vous pouvez utiliser la bibliothèque de chaînes de soulignement comme suit

var common="#box"
var href="#box1"

_(href).strRight(common)

le résultat sera: 1

Voir: https://github.com/epeli/underscore.string

DÉMO:
http://jsfiddle.net/abdennour/Vyqtt/
Code HTML:

<p>
    <a href="#box1" >img1</a>
    <a href="#box2" >img2</a>
    <a href="#box3" >img3</a>
    <a href="#box4" >img4</a>
</p>
<div style="font-size:30px"></div>

Code JS:

var comm="#box"
$('a').click(function(){
  $('div').html(_($(this).attr('href')).strRight(comm))})

si vous avez le suffixe suivant:

href="box1az" 

Vous pouvez utiliser la prochaine démo:

http://jsfiddle.net/abdennour/Vyqtt/1/

function retrieveNumber(all,prefix,suffix){
 var left=_(all).strRight(prefix);
 return _(left).strLeft(suffix);

}

3

Voici une solution. qui vérifie l'absence de données

var someStr = 'abc'; // add 123 to string to see inverse

var thenum = someStr.match(/\d+/);

if (thenum != null )
{
    console.log(thenum[0]);
}
else
{
 console.log('no number');
}

2

Utilisez ce code sur une ligne pour obtenir le premier numéro d'une chaîne sans obtenir d'erreurs:

var myInt = parseInt(myString.replace(/^[^0-9]+/, ''), 10);

2

s'il vous plaît vérifier ci-dessous javaScripts, là vous ne pouvez obtenir que le numéro

var txt = "abc1234char5678#!9";
var str = txt.match(/\d+/g, "")+'';
var s = str.split(',').join('');
alert(Number(s));

production : 1234567789


2

Vous pouvez extraire des nombres d'une chaîne à l'aide d'une expression régulière:

let string = "xxfdx25y93.34xxd73";
let res = string.replace(/\D/g, "");
console.log(res); 

sortie: 25933473


1
var elValue     = "-12,erer3  4,-990.234sdsd";

var isNegetive = false;
if(elValue.indexOf("-")==0) isNegetive=true;

elValue     = elValue.replace( /[^\d\.]*/g, '');
elValue     = isNaN(Number(elValue)) ? 0 : Number(elValue);

if(isNegetive) elValue = 0 - elValue;

alert(elValue); //-1234990.234

Ajoutez une explication. Par exemple, pourquoi vous utilisez notamment cette expression régulière.
mentallurg

1

Cette réponse couvrira la majeure partie du scénario. Je peux traverser cette situation lorsque l'utilisateur essaie de copier-coller le numéro de téléphone

  $('#help_number').keyup(function(){
    $(this).val().match(/\d+/g).join("")
  });

Explication:

str= "34%^gd 5-67 6-6ds"

str.match(/\d+/g)

Il donnera un tableau de chaînes en sortie >> ["34", "56766"]

str.match(/\d+/g).join("")

join convertira et concaténera les données du tableau en une seule chaîne

sortie >> "3456766"

Dans mon exemple, j'ai besoin de la sortie 209-356-6788 donc j'ai utilisé remplacer

  $('#help_number').keyup(function(){
    $(this).val($(this).val().match(/\d+/g).join("").replace(/(\d{3})\-?(\d{3})\-?(\d{4})/,'$1-$2-$3'))
  });

0
changeStrangeDate(dateString: string) {
var sum = 0;
var numbers = dateString.match(/\d+/g);
if (numbers.length > 1) {
  numbers.forEach(element => {
    sum += parseInt(element);
  }
  );
}
console.log(new Date(sum).toDateString());
return new Date(sum).toUTCString();

}

Vous pouvez le faire comme ça, puis appeler la fonction où vous en avez besoin, avec le paramètre.

this.changeStrangeDate('/Date(1551401820000-0100)/');

0

Vous pouvez faire une fonction comme celle-ci

function justNumbers(string) 
    {
        var numsStr = string.replace(/[^0-9]/g,'');
        return parseInt(numsStr);
    }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.