2012-06-06 27 views
7

Ben maç olacak regex ifadesini gerekmektedir:Regex eşleşen numara ve ondalık

.5 
0.5 
1.5 
1234 

ama DEĞİL

0.5.5 
absnd (any letter character or space) 

Ben karşılamasını bu var 0.5.5

^[.?\d]+$ 
+0

en iyi yanıtı, daha doğrusu bir araştırma makale burada: https://stackoverflow.com/a/39399503/715269 – Gangnus

cevap

18

Bu oldukça yaygın bir görevdir. Ben başa biliyorum basit yolu şudur:

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

böyle böyle sıfır virgül veya şeyleri lider izin isteyip gibi diğer komplikasyonlar da vardır. Bu, olmasını istediğiniz kadar karmaşık olabilir. Bir kelime sonu yoktur

^[+-]?(\d*|\d{1,3}(,\d{3})*)(\.\d+)?\b$ 

\b Yani, ama en az bir rakamı gerektirecek bir sinsi yolu olarak kullanıyorum: Eğer 1,234,567.89 formatını izin vermek istiyorsanız Örneğin, bu gidebilirsiniz dizenin sonu. Bu şekilde boş bir dize veya tek bir + eşleşmeyecektir. Bununla birlikte, regex'lerinin sayısal dizeleri ayrıştırmak için ideal bir yol olmadığını belirtmek isteriz. Bildiğim tüm modern programlama dilleri, bunu yapmak için hızlı, basit, yerleşik yöntemlere sahiptir.

+1

1? – niko

+0

downvoter bakım paylaşmak istiyorsunuz için –

+0

Görünüşe göre bu parçaların etrafında bir trol var. Ben de düştü. –

1

ancak tüm Bu işe yarayabilir:

^(?:\d*\.)?\d+$ 
+1

Bu ondalık nokta gerektirir. –

+0

Yapıyor, ben de parantezde \ d * ile eşleşiyorum, \ d + – niko

+0

Artık Tamam görünüyor. Ben siz eklemeden önce yorum yaptım. –

3

şu çalışmalıdır:

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

Bu dizede ikiden az . karakter olmadığından emin olmak için bir negatif ileri yönlü kullanır.

http://www.rubular.com/r/N3jl1ifJDX

+0

Bu, dizeden iki kez geçiyor olsa da. –

+0

Bunu neden bu kadar karmaşık hale getirmek istersiniz? –

+3

Tyler ve Justin - Yöntemin daha iyi olduğunu kabul ediyorum, ancak bunu alternatif olarak bırakacağım. Lookahead yöntemi, bunun gibi birden fazla koşulu (örneğin, şifre doğrulama) kontrol etmek için iyidir, ancak böyle basit bir şeyi zorlaştırır, bir +1'in tadını çıkarın! –

10

kimse negatif sayılar için muhasebe gibi görünüyor. Ayrıca, bazıları gereksiz olan bir yakalama grubu oluşturuyor. Bu en kapsamlı çözüm IMO.

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

DÜZENLEME: Neden downvote?

+0

Tamam, bana bir iyilik var. –

+2

*, el sıkışmasına * ulaşıyor –

2

İşte herhangi göz-aheads kullanabilir veya bakmak-behinds gelmez çok daha basit çözüm:

^\d*\.?\d+$ 
açıkça neden bu işleri anlamak için

, sağdan sola okumak:

  • En az bir basamak sonunda gereklidir.
    7
    77 çalışır
    .77 çalışır
    0.77 rakamı önceki tek dönem isteğe bağlıdır
  • çalışmıyor
    0.
    boş bir dize çalışmıyor işleri .
    .77
  • (isteğe bağlı) döneminden önceki herhangi bir sayıda rakam çalışmaz
    77 işler
    ..77 çalışır. .77 eserler
    0.77
    0077.77
    0077 RegEx tabanlı DOS saldırıları dert değil avantajını göz-aheads ve bakmak-behinds etti kullanmama

işleri çalışır.

HTH

İlgili konular