Regex hanya untuk angka


309

Saya belum pernah menggunakan ekspresi reguler sama sekali, jadi saya mengalami kesulitan pemecahan masalah. Saya ingin regex hanya cocok ketika string yang terkandung adalah semua angka; tetapi dengan dua contoh di bawah ini cocok dengan string yang berisi semua angka plus tanda sama dengan seperti "1234 = 4321". Saya yakin ada cara untuk mengubah perilaku ini, tetapi seperti yang saya katakan, saya tidak pernah benar-benar melakukan banyak hal dengan ekspresi reguler.

string compare = "1234=4321";
Regex regex = new Regex(@"[\d]");

if (regex.IsMatch(compare))
{ 
    //true
}

regex = new Regex("[0-9]");

if (regex.IsMatch(compare))
{ 
    //true
}

Dalam hal ini penting, saya menggunakan C # dan .NET2.0.


6
Apakah Anda perlu mencocokkan angka atau angka ? Misalnya: 123.456 adalah angka, tetapi tidak semua digit.
Joel Coehoorn

Tepat, OP tidak benar-benar jelas tentang menggunakan bilangan bulat atau tidak
Sune Rievers

3
Mengapa tidak TryParse string untuk case sederhana itu? bool decimal.TryParse (string string, out desimal result) atau bool int.TryParse (string string, out int result)
Makach

Lihatlah jawaban ini untuk perawatan definitif nomor parsing dengan ekspresi reguler.
tchrist

1
Secara umum, cara termudah untuk memecahkan masalah ekspresi Regex, menurut pendapat saya, adalah dengan menggunakan penerjemah baris perintah, jika bahasa Anda mengizinkannya (sepertinya itu yang paling dilakukan). Karena contoh ini ada di C #, Anda bisa menggunakan linqpad.net , atau Anda bisa menggunakan breakpoint di debugger dan kemudian menggunakan jendela langsung di VS sebagai CLI.
andrew

Jawaban:


478

Gunakan jangkar awal dan akhir.

Regex regex = new Regex(@"^\d$");

Gunakan "^\d+$"jika Anda harus mencocokkan lebih dari satu digit.


Perhatikan bahwa "\d"akan cocok [0-9]dan karakter digit lainnya seperti angka Arab Timur ٠١٢٣٤٥٦٧٨٩. Gunakan "^[0-9]+$"untuk membatasi kecocokan hanya ke angka Arab 0 - 9.


Jika Anda perlu menyertakan representasi numerik selain hanya digit (seperti nilai desimal untuk pemula), lalu lihat @tchrist 's panduan komprehensif untuk parsing nomor dengan ekspresi reguler .


Bagaimana dengan sejumlah nilai numerik? Ini biasanya berlaku untuk kode pos negara-negara tertentu seperti India. Saya kira kita mungkin harus melakukan pemeriksaan panjang string setelah ini?
Najeeb

2
@Najeeb Ya, karena kode pos India adalah angka 6-digit, Anda dapat menggunakan sesuatu seperti "^\d{6}$". Beberapa negara lain memiliki aturan yang lebih rumit untuk kode pos, jadi solusi regex untuk banyak negara juga bisa menjadi sangat rumit. Lihatlah beberapa contoh di stackoverflow.com/q/578406/1288
Bill the Lizard

Bagaimana bisa jika string input adalah sesuatu seperti: "3 a" itu masih akan cocok? Adakah yang tahu bagaimana saya bisa mencocokkannya HANYA jika ada angka, dan tidak ada yang lain (kecuali untuk tanda negatif saya kira). Saat ini saya sudah mengaturnya seperti ini "-? [0-9] +".
Matius

105

Regex Anda akan cocok dengan apa pun yang berisi angka, Anda ingin menggunakan jangkar untuk mencocokkan seluruh string dan kemudian mencocokkan satu atau lebih angka:

regex = new Regex("^[0-9]+$");

Surat ^wasiat akan melabuhkan bagian awal tali, huruf $wali akan melabuhkan ujung tali, dan +huruf wangi akan mencocokkan satu atau lebih dari apa yang mendahuluinya (angka dalam hal ini).


38

Jika Anda perlu mentolerir titik desimal dan seribu penanda

var regex = new Regex(@"^-?[0-9][0-9,\.]+$");

Anda akan memerlukan "-", jika angkanya bisa negatif.


@Florin Ghita. Terima kasih. "-" harus di awal.
Andy

3
Regex ini juga secara keliru mengizinkan tanda negatif utama ( -) dan titik ( .) muncul lebih dari sekali.
DavidRR

5
Anda dapat membuat -dan .opsional melalui ?. -?\d+(?:\.\d+)?akan cocok dengan bilangan bulat atau desimal. (Bagian ?:dalam parens hanya menjadikan parens sebagai grup yang tidak menangkap dan digunakan hanya grup untuk kejelasan.)
butterywombat

2
Gagal untuk kasus tepi seperti 1, .5, tetapi jika Anda mengawasi itu. masih gagal untuk kasus dasar seperti -2. Silakan ubah ke ^-?[0-9][0-9,\.]*$untuk menghindari kegagalan untuk kasus dasar. + diganti dengan *
PrivateOmega

Satu skenario saya hilang di sini adalah notasi Rekayasa (1.2345e-4) ada saran tentang itu
WolfiG

18

Ini cocok karena menemukan "kecocokan" bukan kecocokan dari string penuh. Anda dapat memperbaikinya dengan mengubah regexp Anda untuk secara spesifik mencari bagian awal dan akhir string.

^\d+$

16

Mungkin metode saya akan membantu Anda.

    public static bool IsNumber(string s)
    {
        return s.All(char.IsDigit);
    }

3
Perlu diingat bahwa itu Char.IsDigitkembali trueuntuk setiap karakter yang merupakan anggota dari kategori UnicodeCategory.DecimalDigitNumber . Ini mungkin bukan yang diinginkan OP. Lihat juga Mengapa Char.IsDigit mengembalikan true untuk karakter yang tidak dapat diuraikan ke int? .
DavidRR


16

Ini bekerja dengan bilangan bulat dan angka desimal. Itu tidak cocok jika nomor memiliki pemisah koma seribu,

"^-?\\d*(\\.\\d+)?$"

beberapa string yang cocok dengan ini:

894
923.21
76876876
.32
-894
-923.21
-76876876
-.32

beberapa string yang tidak:

hello
9bye
hello9bye
888,323
5,434.3
-8,336.09
87078.

11

^ \ d + $, yang merupakan "awal string", "1 atau lebih digit", "akhir string" dalam bahasa Inggris.


10

Jika Anda perlu memeriksa apakah semua digit adalah angka (0-9) atau tidak,

^[0-9]+$

1425 BENAR

0142 BENAR

0 BENAR

1 BENAR

154a25 SALAH

1234 = 3254 SALAH


10

Ini pekerjaan saya:

^(-?[1-9]+\\d*([.]\\d+)?)$|^(-?0[.]\\d*[1-9]+)$|^0$

Dan beberapa tes

Tes positif:

string []goodNumbers={"3","-3","0","0.0","1.0","0.1","0.0001","-555","94549870965"};

Tes negatif:

string []badNums={"a",""," ","-","001","-00.2","000.5",".3","3."," -1","--1","-.1","-0"};

Diperiksa tidak hanya untuk C #, tetapi juga dengan Java, Javascript dan PHP


".3", "3." sebenarnya angka yang baik (artinya masing-masing 0,3 dan 3,0). kami melihat ini sepanjang waktu di sistem sumber, dan sebagian besar fungsi to_number (xx) dari bahasa yang Anda sebutkan akan mengenali dan mengubahnya dengan benar. Terima kasih.
Tagar

1
@Ruslan Anda benar bahwa dalam banyak sistem ".3", "3." akan menguraikan nomor yang valid dan digunakan seperti yang Anda sebutkan "0,3" dan "3,0". Tetapi di sisi lain - yaitu nilai yang dikonversi , jadi nilai asli ".3" dan "3." bukan nomor yang benar-benar ada.
Marina K.

9

Maaf untuk pemformatan jelek. Untuk sejumlah digit:

[0-9]*

Untuk satu digit atau lebih:

[0-9]+

7

Walaupun bukan solusi di atas yang sesuai dengan tujuan saya, ini berhasil bagi saya.

var pattern = @"^(-?[1-9]+\d*([.]\d+)?)$|^(-?0[.]\d*[1-9]+)$|^0$|^0.0$";
return Regex.Match(value, pattern, RegexOptions.IgnoreCase).Success;

Contoh nilai yang valid: "3", "-3", "0", "0,0", "1,0", "0,7", "690,7", "0,0001", "-555", "945465464654"

Contoh nilai yang tidak valid: "a", "", "", ".", "-", "001", "00.2", "000.5", ".3", "3.", "-1" , "--1", "-.1", "-0", "00099", "099"


4

Cara lain: Jika Anda ingin mencocokkan nomor internasional seperti Persia atau Arab, maka Anda dapat menggunakan ungkapan berikut:

Regex = new Regex(@"^[\p{N}]+$");

Untuk mencocokkan penggunaan karakter periode literal:

Regex = new Regex(@"^[\p{N}\.]+$");

4

gunakan jangkar awal dan akhir.

 Regex regex = new Regex(@"^\d$");
 Use "^\d+$" if you need to match more than one digit.

3

Regex untuk angka integer dan floating point:

^[+-]?\d*\.\d+$|^[+-]?\d+(\.\d*)?$

Angka dapat dimulai dengan titik (tanpa digit depan), dan angka dapat diakhiri dengan titik (tanpa trailing digit) Regex di atas akan mengenali keduanya sebagai angka yang benar.

SEBUAH . (titik) itu sendiri tanpa angka bukanlah angka yang benar. Itu sebabnya kita membutuhkan dua bagian regex di sana (dipisahkan dengan "|").

Semoga ini membantu.


1
Ini solusi paling lengkap. Selamat!
Renato Medeiros

2

Saya pikir ini adalah yang paling sederhana dan menerima cara penulisan angka di Eropa dan Amerika Serikat, mis. USA 10,555.12 Eropa 10,555,12 Juga yang satu ini tidak memungkinkan beberapa koma atau titik satu sama lain, misalnya 10..22 atau 10, .22 Selain angka-angka ini seperti 0,55 atau, 55 akan berlalu. Ini mungkin berguna.

^([,|.]?[0-9])+$


-4

Regex regex = Regex baru ("^ [0-9] {1,4} = [0-9] {1,4] $")


5
Bisakah Anda jelaskan jawaban Anda? Anda akan melihat bahwa jawaban lain untuk pertanyaan ini memiliki beberapa tingkat penjelasan tentang apa yang dilakukan masing-masing bagian dari regex, yang kurang Anda miliki.
Wai Ha Lee
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.