Yalnızca sayıları döndürmek için javascript kullanan normal ifade


129

"Something12" veya "something102" gibi bir dizem varsa, javascript'te sadece sayı kısımlarını döndürmek için bir normal ifadeyi nasıl kullanabilirim?

Yanıtlar:


226

Düzenli ifadeler:

var numberPattern = /\d+/g;

'something102asdfkj1948948'.match( numberPattern )

Bu, '102' ve '1948948' içinde iki öğe olan bir Dizi döndürecektir. Dilediğiniz gibi çalışın. Herhangi biriyle eşleşmezse, boş döndürür.

Bunları birleştirmek için:

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

Karmaşık ondalık sayılarla uğraşmadığınızı varsayarsak, bu yeterli olacaktır.


3
err. nit-seçici olmaktan nefret eder, ancak bu bir nesne değil (en azından kromda) bir dizi döndürür.
Maus

14
Yine de tüm diziler nesnedir, değil mi?
meder omuraliev

6
@MuhammadUmer - denedin mi?
meder omuraliev

2
@Onza'dan önceki ters eğik d.match(/\d+/g)
çizgiyi kaçırıyorsunuz

10
@MuhammadUmer, @meder: Siz ikiniz güçleri birleştirmelisiniz: parseInt('987d98sf79s7f9s8f9sf'.match(/\d+/gi).join(''))
Joisey Mike

199

Ayrıca tüm rakam olmayan karakterleri ( \Dveya [^0-9]) çıkarabilirsiniz :

let word_With_Numbers = 'abc123c def4567hij89'
let word_Without_Numbers = word_With_Numbers.replace(/\D/g, '');

console.log(word_Without_Numbers)


OP'nin dizeyi değil, "sadece sayı kısımlarını" istemesi dışında.
Scott Fraley

24

Ondalık kesirli ve eksi işaretli sayı için şu pasajı kullanıyorum:

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

Güncelleme: - 7/9/2018

Normal ifadeyi görsel olarak düzenlemenizi sağlayan bir araç buldum: JavaScript Normal İfade Ayrıştırıcı ve Görselleştirici .

Güncelleme:

İşte regexp'de hata ayıklayabileceğiniz bir tane daha: Online regex tester ve debugger .

Güncelleme:

Bir diğeri: RegExr .

Güncelleme:

Regexper ve Regex Pal .


Ondalık sayılar ve negatif
sayılarla

17

Yalnızca rakam istiyorsanız:

var value = '675-805-714';
var numberPattern = /\d+/g;
value = value.match( numberPattern ).join([]);
alert(value);
//Show: 675805714

Şimdi rakamları birleştirdin


9

Sanırım dizeden sayı (lar) almak istiyorsunuz. Bu durumda aşağıdakileri kullanabilirsiniz:

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

1
Sadece açıklığa kavuşturmak için, get_numbers/1sayı değil, bir dize dizisi döndürür. ["102"]["102", "12"]
Örneğiniz

2

Verilen cevaplar aslında sorunuzla eşleşmiyor, bu da sondaki bir sayı anlamına geliyor. Ayrıca, bir ipi geri aldığınızı unutmayın; gerçekten bir sayıya ihtiyacınız varsa , sonucu dökün:

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

Bir web sayfasında sayısal öğe kimlikleriyle uğraşıyorsanız, kodunuz aynı zamanda yararlı bir şekilde bir kabul edebilir Element, sayıyı onun id(veya bir ile ilk ebeveyninden id) çıkarabilir ; EventKullanışlı bir şeyiniz varsa, muhtemelen bundan Elementda yararlanabilirsiniz.


Bu güzel bir cevap olsa da, diğer cevapların "aslında [soruyla] eşleşmediğini" düşünmüyorum. Aslında diğer cevaplar daha çok yönlüdür. Sondaki sayılarla ve ortadaki sayılarla çalışacaklar. OP'nin YALNIZCA sondaki sayılarla çalışmasını istediğini varsaymak biraz varsayımsaldır.
Xandor


2

IMO, Chen Dachao'nun şu anda 3 numaralı cevabı, herhangi bir sayıyı yakalamak istiyorsanız doğru yoldur, ancak normal ifade şunlardan kısaltılabilir:

/[-]{0,1}[\d]*[\.]{0,1}[\d]+/g

için:

/-?\d*\.?\d+/g

Örneğin, bu kod:

"lin-grad.ient(217deg,rgba(255, 0, 0, -0.8), rgba(-255,0,0,0) 70.71%)".match(/-?\d*\.?\d+/g)

bu diziyi üretir:

["217","255","0","0","-0.8","-255","0","0","0","70.71"]

Normal ifadeyi tam olarak test etmesi ve burada kaydırması gerekmemesi için bir MDN doğrusal gradyan örneğini kestim. Negatif sayılar, ondalık sayılar, deg ve% gibi birim son ekleri, tutarsız virgül ve boşluk kullanımı ve fazladan nokta / nokta ve tire / tire karakterlerini "lin-grad.ient" metnine dahil ettiğimi düşünüyorum. ". Eksik bir şey varsa lütfen bana bildirin. İşleyemediğini görebildiğim tek şey, "0..8" gibi kötü biçimlendirilmiş bir ondalık sayı.

Gerçekten bir sayı dizisi istiyorsanız, tüm diziyi aynı kod satırında dönüştürebilirsiniz:

array = whatever.match(/-?\d*\.?\d+/g).map(Number);

CSS işlevlerini ayrıştıran özel kodumun nokta / nokta karakterinin sayısal olmayan kullanımı konusunda endişelenmesine gerek yoktur, bu nedenle normal ifade daha da basit olabilir:

/-?[\d\.]+/g

2

Bölme ve normal ifade kullanma:

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

1

@ Syntle'ın cevabına göre, yalnızca sayısal olmayan karakterlere sahipseniz, bir Uncaught TypeError: Cannot read property 'join' of null.

Bu, eşleşme bulunmazsa hataları önler ve boş bir dize döndürür:

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


0

Ayrıca nokta / virgülle ayrılmış sayılar istiyorsanız, o zaman:

\d*\.?\d*

veya

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

Normal ifadelerinizi test etmek için https://regex101.com/ kullanabilirsiniz .


0

Diğer çözümlerin sahip olduğu her şey, ancak biraz doğrulama ile

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