Yalnızca sayılar için normal ifade


309

Hiç düzenli ifadeler kullanmadım, bu yüzden sorun giderme konusunda sorun yaşıyorum. Regex sadece içerilen dize tüm sayılarla eşleşmesini istiyorum; ancak aşağıdaki iki örnekle tüm sayıları ve "1234 = 4321" gibi bir eşittir işaretini içeren bir dize ile eşleşir. Eminim bu davranışı değiştirmenin bir yolu vardır, ama dediğim gibi, normal ifadelerle hiçbir zaman çok şey yapmadım.

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

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

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

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

Önemli olması durumunda, C # ve .NET2.0 kullanıyorum.


6
Sayıları veya rakamları eşleştirmeniz mi gerekiyor ? Örneğin: 123.456 bir sayıdır, ancak tüm rakamlar değildir.
Joel Coehoorn

Tam olarak, OP tamsayıların kullanımı hakkında tamamen açık değil
Sune Rievers

3
Neden bu basit durum için dizeyi TryParse değil? bool ondalık.TryParse (dize dizesi, ondalık sonuç çıktı) veya bool int.TryParse (dize dizesi, int sonuç çıktı)
Makach

Düzenli ifadelerle sayıları ayrıştırmaya yönelik kesin bir tedavi için bu cevaba bakınız .
tchrist

1
Genel olarak, Regex ifadelerinde sorun gidermenin en kolay yolu, bence, diliniz izin veriyorsa (çoğu gibi görünüyorsa) bir komut satırı yorumlayıcısı kullanmaktır. Bu örnek C # içinde olduğundan, linqpad.net kullanabilirsiniz veya hata ayıklayıcıda bir kesme noktası kullanabilir ve sonra VS içinde Immediate penceresini CLI olarak kullanabilirsiniz.
Andrew

Yanıtlar:


478

Başlangıç ​​ve bitiş bağlantılarını kullanın.

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

"^\d+$"Birden fazla rakamla eşleşmeniz gerekiyorsa kullanın .


Eşleşeceğini ve Doğu Arap rakamları gibi diğer rakam karakterlerini "\d"eşleştireceğini unutmayın . Eşleşmeleri yalnızca Arap rakamları 0 - 9 ile sınırlamak için kullanın .[0-9]٠١٢٣٤٥٦٧٨٩"^[0-9]+$"


Eğer (başlayanlar için ondalık değerler gibi) sadece basamak dışında herhangi bir sayısal temsillerini dahil etmek gerekiyorsa, o zaman bakın @tchrist 'ın normal ifadeler ile sayılar ayrıştırma için kapsamlı bir rehber .


Belirli sayıda sayısal değere ne dersiniz? Bu genellikle Hindistan gibi bazı ülkelerin posta kodları için geçerlidir. Bundan sonra bir dize uzunluğu kontrolü yapmak zorunda olabilir sanırım?
Najeeb

2
@Najeeb Evet, Hindistan posta kodları 6 basamaklı sayılar olduğundan, benzer bir şey kullanabilirsiniz "^\d{6}$". Bazı diğer ülkeler posta kodları için daha karmaşık kurallara sahiptir, bu nedenle birden fazla ülke için normal ifade çözümleri de oldukça karmaşık hale gelebilir. Stackoverflow.com/q/578406/1288
Bill the Lizard

Giriş dizesi şuna benzerse nasıl olur: "3 a" hala eşleşir? Herkes SADECE sayılar varsa maç için nasıl alabilirim biliyor ve başka bir şey (varsayalım negatif işareti hariç). Şu anda böyle ayarladım "-? [0-9] +".
Matthew

105

Normal ifadeniz sayı içeren herhangi bir şeyle eşleşir, tüm dizeyi eşleştirmek ve ardından bir veya daha fazla sayıyla eşleştirmek için çapa kullanmak istersiniz:

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

^Dize başlayan demir atacak, $dize sonuna demir atacak ve +bir ya maç olacak daha (bu durumda bir sayı) ondan önce ne.


38

Ondalık basamak ve bin işaretleyiciyi tolere etmeniz gerekiyorsa

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

Sayı negatif gidebiliyorsa, "-" işaretine ihtiyacınız olacaktır.


@Florin Ghita. Teşekkürler. "-" başında olmalı.
Andy

3
Bu normal ifade ayrıca, önde gelen negatif işaretin ( -) ve nokta ( .) 'nın birden çok kez oluşmasına izin verir .
DavidRR

5
üzerinden -ve .isteğe bağlı yapabilirsiniz ?. -?\d+(?:\.\d+)?tamsayılarla veya ondalıklarla eşleşir. (The ?:parens sadece parens yakalama olmayan bir grup yapar ve sadece netlik için grup için kullanılır.)
butterywombat

2
1, .5 gibi kenar durumlarda başarısız olur, ancak bunu gözetirseniz. yine de -2 gibi temel durumlar için başarısız oluyor. ^-?[0-9][0-9,\.]*$Temel durumun başarısız olmasını önlemek için lütfen değiştirin . + ile değiştirilir *
PrivateOmega

Burada eksik olduğum bir senaryo, Mühendislik notasyonu (1.2345e-4) hakkında herhangi bir öneri?
WolfiG

18

Eşleşir, çünkü tam dizenin eşleşmesini değil "eşleşme" buluyor. Regexp'inizi özellikle dizenin başlangıcını ve sonunu arayacak şekilde değiştirerek bunu düzeltebilirsiniz.

^\d+$

16

Belki benim yöntemim size yardımcı olacaktır.

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

3
UnicodeCategory.DecimalDigitNumber kategorisinin üyesi olan herhangi bir karakter için bunun Char.IsDigitgeri döndüğünü unutmayın . OP'nin istediği bu olmayabilir. Ayrıca bkz. Char.IsDigit, int'e ayrıştırılamayan karakterler için neden true değerini döndürüyor? . true
DavidRR


16

Bu, tamsayılar ve ondalık sayılarla çalışır. Sayının koma binlik ayırıcıya sahip olmasıyla eşleşmez,

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

bununla eşleşen bazı dizeler:

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

olmayan bazı dizeler:

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

11

^ \ d + $, "dizgenin başlangıcı", "1 veya daha fazla basamak", "dizenin sonu" dır.


10

Tüm basamakların sayı (0-9) olup olmadığını kontrol etmeniz gerekiyorsa,

^[0-9]+$

1425 DOĞRU

0142 DOĞRU

0 DOĞRU

1 DOĞRU

154a25 YANLIŞ

1234 = 3254 YANLIŞ


10

İşte benim çalışanım:

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

Ve bazı testler

Pozitif testler:

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

Negatif testler:

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

Sadece C # için değil, Java, Javascript ve PHP ile de kontrol edildi


" 0,3" , "3". aslında iyi sayılardır (sırasıyla 0.3 ve 3.0 anlamına gelir). bunu kaynak sistemlerde her zaman görüyoruz ve bahsettiğiniz dillerin çoğu to_number (xx) işlevi bunları doğru bir şekilde tanıyacak ve dönüştürecektir. Teşekkürler.
Tagar

1
@Ruslan haklısın birçok sistemde ".3", "3." geçerli sayıya ayrıştırılır ve "0.3" ve "3.0" da belirtildiği gibi kullanılır. Ama diğer yandan - bu dönüştürülmüş değer, bu yüzden orijinal değer ".3" ve "3". gerçekte mevcut bir sayı değil.
Marina K.

9

Çirkin biçimlendirme için özür dileriz. Herhangi bir sayı basamağı için:

[0-9]*

Bir veya daha fazla basamak için:

[0-9]+

7

Yukarıdaki çözümlerin hiçbiri amacımla uyuşurken, bu benim için çalıştı.

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

Geçerli değerlere örnek: "3", "-3", "0", "0.0", "1.0", "0.7", "690.7", "0.0001", "-555", "945465464654"

Geçerli olmayan değerlere örnek: "a", "", "", ".", "-", "001", "00.2", "000.5", ".3", "3.", "-1" , "--1", "-.1", "-0", "00099", "099"


4

Başka bir yol: Farsça veya Arapça gibi uluslararası numaralarla eşleşmek istiyorsanız, aşağıdaki ifadeyi kullanabilirsiniz:

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

Değişmez dönem karakterini eşleştirmek için şunu kullanın:

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

4

başlangıç ​​ve bitiş bağlantılarını kullanın.

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

3

Tam sayı ve kayan nokta sayıları için normal ifade:

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

Bir sayı nokta ile başlayabilir (baştaki rakam (lar) olmadan) ve sayı nokta ile sona erebilir (arka rakam (lar) olmadan). Normal ifadenin yukarısında her ikisi de doğru sayılar olarak tanınacaktır.

A. (nokta) herhangi bir rakam olmadan kendisi doğru bir sayı değildir. Bu yüzden iki regex parçasına ihtiyacımız var ("|" ile ayrılmış).

Bu yardımcı olur umarım.


1
Bu en eksiksiz çözümdür. Tebrikler!
Renato Medeiros

2

Bence bu en basit olanıdır ve Avrupa ve ABD sayı yazma yollarını kabul eder, örneğin ABD 10,555.12 Avrupa 10.555,12 Ayrıca bu, birbiri ardına birkaç virgül veya noktaya izin vermez, örneğin 10..22 veya 10, .22 Buna ek olarak .55 veya 55 gibi sayılar geçecekti. Bu kullanışlı olabilir.

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

1

Bir dizeden yalnızca sayıları ayıklamak istiyorsanız "\ d +" kalıbı yardımcı olacaktır.


-4

Normal ifade normal ifade = yeni Normal ifade ("^ [0-9] {1,4} = [0-9] {1,4] $")


5
Cevabınızı biraz açıklayabilir misiniz lütfen? Bu soruya verilen diğer cevapların, normal ifadenin her bir kısmının ne yaptığına dair bir açıklama seviyesine sahip olduğunu göreceksiniz.
Wai Ha Lee
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.