Bir dizeden sayı çıkarma ("get")


355

Javascript içinde # box2 gibi bir dize var ve sadece '2' ondan istiyorum.

Denenmiş:

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

Hala uyarıda # box2 döndürür, nasıl çalıştırabilirim?

Sonda eklenmiş herhangi bir uzunluk numarası için uygun olması gerekir.


1
sadece bunu yapabilirsiniz. iyi çalışır. var thestring = $ (this) .attr ('href'); var thenum = parsefloat (test); uyarısı (thenum);
Vivek Shukla

1
Bu kod benim için iyi çalışıyor ama bir durumda, '2.5 / mil' bir dize var ve ben 2.5 dışarı bu çıkarmak istiyorum. Yukarıdaki kod bana 2.5 yerine 25 verir
Bijay Singh

Yanıtlar:


578

Bu özel örnek için,

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

genel durumda:

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

Bu cevap bir nedenden dolayı popülerlik kazandığından, işte bir bonus: normal ifade üreteci.

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, '')göstermeliydi 2, göstermemeliydi 2_col3.
Shiplu Mokaddim

2
@ shiplu.mokadd.im: Soruda herhangi bir referans görmüyorum #box2_col3.
georg

1
Evet referans yok #box2_col3. Ancak \w)(.+$)numaradan sonra başka karakterler olduğunu açıkça gösteren regex OP'ye ( ) bakın .
Shiplu Mokaddim

3
bu durumda deseniniz de sonundan önce bir sayı varsa başarısız olur.
Shiplu Mokaddim

2
Sen yapabilir replacekullanarak öncü sayılarla işi: theString.replace(/^.*\D+/g, '');ama shiplu.mokadd.im çözümü daha iyidir.
LandonSchropp

226

Aşağıdakileri denemelisiniz:

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

sonuç

1234561613213213

1
güzel cevap ama ne sayı kümesini ayrı ayrı istiyorum. yani 1234, 5616133 ...
Amar Singh

1
Veya tek katlı + tamsayıya ayrıştırma:parseInt(txt.match(/\d/g).join(''), 10)
Lukas Liesis

" $ 20.0 ".match(/\d/g).join('') => "200" (sadece söyleyerek)
vsync

91

Bu düzenli ifadenin amacınıza hizmet edeceğini düşünüyorum:

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

Dizeniz nerede txt.

Temelde rakam olmayan her şeyi koparır.

Ben de bunu kullanarak aynı şeyi elde edebilirsiniz düşünüyorum:

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

1
/[^0-9]/gOkunabilirlik için +1. Ayrıca buradaki cevapların çoğuyla birlikte kullanılır: stackoverflow.com/q/1862130/1066234
Kai Noack

58

Aşağıdakileri deneyin: string.replace(/[^0-9]/g, '');Bu, dizede yalnızca rakam bırakarak rakam olmayan tüm karakterleri siler

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
Bu, kabul edilen yanıttan daha iyidir, çünkü küresel olarak tüm sayı olmayanların yerini alır ve btw /[^0-9]/gile değiştirilebilir /[^\d]/g.
CPHPython

52

Eşleme işlevini kullanma.

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

jsfiddle


1
Ayrıca var thenum = + thestring.match (/ \ d + $ /) [0] tamsayısı yapmak için tekli '+' ekleyebilirsiniz.
Sergey Onishchenko

Sanırım bu> 1 basamaklı sayılar için işe yaramıyor? (Sorunun 1 basamaklı sayılar için olduğunu anlıyorum, ancak olası sayılara bakıyorum> 10.)
Felix

@nissemand Tahmin etme . Kendiniz deneyin. Sen bile kemanı görmedin.
Shiplu Mokaddim

Bunu sev. Numarayı dokunmadan veya öğeyi değiştirmeden bir değişkene çıkarmanın en basit yolu. Bir dize içinde bir çok tesadüf için her bir combo takdir ediyorum. yani 12a55 dizesi son sayıyı rapor eder, hepsini değil.
m3nda

1
@YevgeniyAfanasyev olmamalı. Orijinal soruyu kontrol edin. Özellikle son satır. Sayı sonunda olmalıdır.
Shiplu Mokaddim

33

Bu Kurallar ile yukarıda belirtilen tüm kombinasyonları denedim ve çalıştırarak, bu dizede çalışan tek kombinasyon buydu ->(12) 3456-7890

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

Sonuç: "1234567890"

Obs: biliyorum böyle bir dize attr üzerinde olmayacak ama her neyse, çözüm daha iyi, çünkü daha eksiksiz.


str.match(/\d+/g).map(Number)bir dizi dönecektir daha iyi olacağını düşünüyorum
Artem Bernatskyi

33

Ve bu, para birimi ve biçimlendirme ile fiyatları ayıklayan bir snippettir:

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

13

harika parseInt yöntemi kullanabilirsiniz

baştaki rakamları bir sayıya dönüştürür

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

18
Bu sadece sayı dizenin başında olduğunda işe
yarar

2
geri dönen NaN
Ahmed Syed


4

Normal ifadeyi kullanabilirsiniz.

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

Bu uyarır 2.


4
-1 çoklu basamak yakalanır ve uyarının dizi kullanarak olmayacak
Shiplu Mokaddim

4

İle Normal İfadeler , nasıl örneğin bir dize gelen rakamları elde etmek:

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

sonucu myString" 24"

bu çalışan kodun bir örneğini burada görebilirsiniz: http://ideone.com/iOCf5G


5
java! == javascript - replaceAll, standart javascript'te mevcut değildir. Yalnızca jQuery gibi bazı kütüphaneler bu yönteme sahiptir. Gelecekte açıklığa kavuşturmalısınız.
Levi Roberts

3

Alt Çizgi Dize Kitaplığı'nı aşağıdaki gibi kullanabilirsiniz

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

_(href).strRight(common)

sonuç: 1

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

DEMO:
http://jsfiddle.net/abdennour/Vyqtt/
HTML Kodu:

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

JS Kodu:

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

aşağıdaki gibi bir sonek varsa:

href="box1az" 

Bir sonraki demosu kullanabilirsiniz:

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

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

}

3

İşte bir çözüm. veri olup olmadığını kontrol eden

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

Hata olmadan bir dizedeki ilk sayıyı almak için bu tek satırlık kodu kullanın:

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

2

javaScripts'in altında kontrol edin, orada sadece sayı alabilirsiniz

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

çıktı : 1234567789


2

Normal ifadeyi kullanarak bir dizeden sayıları ayıklayabilirsiniz:

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

çıktı: 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

Reklam bir açıklama. Örneğin, neden bu normal ifadeyi kullanıyorsunuz?
mentallurg

1

Bu cevap senaryonun çoğunu kapsayacaktır. Kullanıcı telefon numarasını kopyalamaya çalıştığında bu durumla karşılaşabilirim

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

Açıklama:

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

str.match(/\d+/g)

Çıktı olarak bir dizi dizgi verecektir >> ["34", "56766"]

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

join, bu dizi verilerini tek bir dizeye dönüştürür ve birleştirir

çıktı >> "3456766"

Örneğimde 209-356-6788 olarak çıktıya ihtiyacım var, bu yüzden değiştirme kullandım

  $('#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();

}

Bunu böyle yapabilir ve daha sonra parametre ile ihtiyacınız olan yerde fonksiyonu çağırabilirsiniz.

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

0

Bunun gibi bir işlev yapabilirsiniz

function justNumbers(string) 
    {
        var numsStr = string.replace(/[^0-9]/g,'');
        return parseInt(numsStr);
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.