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é.

user1022585
la source
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
1
EN RELATION
Kai Noack

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>

georg
la source
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
Jason Marshall
la source
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,'');
Theodoros Klikas
la source
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, ''));

xbalaji
la source
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

Shiplu Mokaddim
la source
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.

Paulo Roberto Rosa
la source
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
Lacho Tomov
la source
13

vous pouvez utiliser une excellente méthode parseInt

il convertira les premiers chiffres en nombre

parseInt("-10px");
// will give you -10
Eugene Tiurin
la source
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.

Robby Shaw
la source
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

Jorgesys
la source
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);

}
Abdennour TOUMI
la source
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');
}
Gene Bo
la source
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);
Ruslan
la source
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

Thilina Sampath
la source
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

Cassio Seffrin
la source
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
Manoj Chavanke
la source
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'))
  });
Vinay Kumar
la source
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)/');
Irakli Kardava
la source
0

Vous pouvez faire une fonction comme celle-ci

function justNumbers(string) 
    {
        var numsStr = string.replace(/[^0-9]/g,'');
        return parseInt(numsStr);
    }
Danielle Cohen
la source