Regex menggunakan javascript untuk mengembalikan angka


129

Jika saya memiliki string seperti "something12" atau "something102", bagaimana saya menggunakan regex di javascript untuk mengembalikan hanya bagian-bagian nomor?

Jawaban:


226

Ekspresi reguler:

var numberPattern = /\d+/g;

'something102asdfkj1948948'.match( numberPattern )

Ini akan mengembalikan Array dengan dua elemen di dalamnya, '102' dan '1948948'. Operasikan sesuai keinginan. Jika tidak cocok, itu akan mengembalikan nol.

Untuk menyatukan mereka:

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

Dengan anggapan Anda tidak berurusan dengan desimal kompleks, ini seharusnya sudah cukup.


3
berbuat salah. benci menjadi rewel, tapi ini mengembalikan array, bukan objek (setidaknya dalam chrome).
Maus

14
Semua array adalah objek, bukan?
meder omuraliev

6
@MuhammadUmer - apakah Anda mencobanya?
meder omuraliev

2
@Onza Anda kehilangan garis miring terbalik sebelum d, jadi.match(/\d+/g)
meder omuraliev

10
@MuhammadUmer, @meder: Kalian berdua harus menggabungkan pasukan: parseInt('987d98sf79s7f9s8f9sf'.match(/\d+/gi).join(''))
Joisey Mike

199

Anda juga dapat menghapus semua karakter non-digit ( \Datau [^0-9]):

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

console.log(word_Without_Numbers)


Yah, kecuali bahwa OP ingin "hanya bagian nomor," bukan string.
Scott Fraley

24

Untuk angka dengan pecahan desimal dan tanda minus, saya menggunakan cuplikan ini:

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

Pembaruan: - 7/9/2018

Menemukan alat yang memungkinkan Anda untuk mengedit ekspresi reguler secara visual: JavaScript Regular Expression Parser & Visualizer .

Memperbarui:

Berikut ini satu lagi yang dengannya Anda bahkan dapat debugger regexp: Penguji dan debugger regex online .

Memperbarui:

Satu lagi: RegExr .

Memperbarui:

Regexper dan Regex Pal .


Sempurna, satu-satunya solusi yang bekerja dengan desimal dan angka negatif
ArmaGeddON

17

Jika Anda hanya ingin digit:

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

Sekarang Anda mendapatkan digit bergabung


9

Saya kira Anda ingin mendapatkan nomor dari string. Dalam hal ini, Anda dapat menggunakan yang berikut ini:

// 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
Hanya untuk membuatnya jelas, get_numbers/1mengembalikan array string, bukan angka. Sebagai contoh Anda, ini akan kembali: * ["102"]* ["102", "12"]* null
Sơn Trần-Nguyễn

2

Jawaban yang diberikan tidak benar-benar sesuai pertanyaan Anda, yang tersirat Trailing nomor. Juga, ingat bahwa Anda mendapatkan string kembali; jika Anda benar - benar membutuhkan nomor, berikan hasilnya:

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

Jika Anda berurusan dengan id item numerik pada halaman web, kode Anda juga bisa berguna menerima Element, mengekstraksi nomor dari id(atau orang tua pertamanya dengan id); jika Anda memiliki alat yang Eventberguna, kemungkinan Anda juga bisa mendapatkannya Element.


Meskipun ini adalah jawaban yang bagus saya tidak berpikir bahwa jawaban yang lain "tidak benar-benar cocok dengan pertanyaan". Sebenarnya jawaban lain lebih fleksibel. Mereka akan bekerja dengan trailing number dan juga angka di tengah. Agak sombong untuk menganggap OP ingin HANYA bekerja dengan trailing number.
Xandor


2

IMO jawaban # 3 saat ini oleh Chen Dachao adalah cara yang tepat untuk pergi jika Anda ingin mendapatkan nomor apa pun, tetapi ungkapan reguler dapat disingkat dari:

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

untuk:

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

Misalnya, kode ini:

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

menghasilkan array ini:

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

Saya telah memotong contoh gradien linier MDN sehingga sepenuhnya menguji regexp dan tidak perlu menggulir di sini. Saya pikir saya telah memasukkan semua kemungkinan dalam hal angka negatif, desimal, akhiran satuan seperti deg dan%, koma dan penggunaan ruang yang tidak konsisten, dan karakter titik / titik dan tanda hubung / tanda hubung ekstra dalam teks "lin-grad.ient ". Tolong beri tahu saya jika saya melewatkan sesuatu. Satu-satunya hal yang dapat saya lihat yang tidak ditangani adalah angka desimal yang terbentuk dengan buruk seperti "0..8".

Jika Anda benar-benar menginginkan array angka, Anda dapat mengonversi seluruh array dalam baris kode yang sama:

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

Kode khusus saya, yang mem-parsing fungsi-fungsi CSS, tidak perlu khawatir tentang penggunaan karakter dot / periode non-numerik, sehingga ekspresi reguler bisa lebih sederhana:

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

2

Menggunakan split dan regex:

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

1

Sesuai jawaban @ Syntle, jika Anda hanya memiliki karakter non numerik Anda akan mendapatkan Uncaught TypeError: Cannot read property 'join' of null.

Ini akan mencegah kesalahan jika tidak ada kecocokan yang ditemukan dan mengembalikan string kosong:

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


0

Jika Anda ingin nomor yang dipisahkan titik / koma juga, maka:

\d*\.?\d*

atau

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

Anda dapat menggunakan https://regex101.com/ untuk menguji regex Anda.


0

Segala sesuatu yang dimiliki solusi lain, tetapi dengan sedikit validasi

// 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.