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?

Malcolm
sumber

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.

meder omuraliev
sumber
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)

CMS
sumber
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 .

Chen Dachao
sumber
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

Iván Martínez
sumber
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
Andrew Moore
sumber
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.

Pete Jordan
sumber
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
var result = input.match(/\d+/g).join([])
PavelGora
sumber
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
jamess
sumber
2

Menggunakan split dan regex:

    var str = "fooBar0123".split(/(\d+)/);
    console.log(str[0]); // fooBar
    console.log(str[1]); // 0123
SridharKritha
sumber
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('')

Marcelo Viana
sumber
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.

qristjan
sumber
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
Frager.
sumber