Ondalık sayı normal ifade, ondalıktan sonraki rakam isteğe bağlıdır


112

Bir sayıyı doğrulayan, ancak ondalıktan sonra bir rakam gerektirmeyen bir normal ifadeye ihtiyacım var. yani.

123
123.
123.4

hepsi geçerli olur

123..

geçersiz olur

Herhangi biri çok takdir edilecektir!


Yanıtlar:


190

Aşağıdakileri kullanın:

/^\d*\.?\d*$/
  • ^ - Satırın başlangıcı;
  • \d* - 0 veya daha fazla basamak;
  • \.?- İsteğe bağlı nokta (normal ifadede .özel bir karakter olduğu için çıkış karakterli);
  • \d* - 0 veya daha fazla rakam (ondalık kısım);
  • $ - Yolun sonu.

Bu, 0.5 gibi baştaki sıfır gerektirmek yerine 0,5 ondalık sayıya izin verir


2
@OrangeDog, orijinaliniz istenenden daha fazla eşleşiyor. ör. 'cow3.45tornado';)
S. Albano

39
Ayrıca geçerli bir ondalık sayı olmayan tek bir nokta ile eşleşir. /^\d*\.?\d+$/Ondalık noktadan sonra bir rakamı zorlayan daha iyi bir normal ifade olacaktır .
Chandranshu

2
@Chandranshu ve bu, değişikliğinizin de çözeceği boş bir dizeyle eşleşir.
OGHaza

2
@Chandranshu "ondalıktan sonra bir rakam gerektirmez"
OrangeDog

3
Bu çözüm işe yaramıyor. OP açıkça söylerken ondalık sayı gerektirir: isteğe bağlı ondalıklar.
Alex G

113
/\d+\.?\d*/

Bir veya daha fazla rakam ( \d+), isteğe bağlı nokta ( \.?), sıfır veya daha fazla rakam ( \d*).

Kullanımınıza veya normal ifade motoruna bağlı olarak başlangıç ​​/ bitiş satırı bağlantıları eklemeniz gerekebilir:

/^\d+\.?\d*$/

Düzenli ifade görselleştirme

Debuggex Demosu


12
Evet, ama en çok oylanan cevap yanlış, hem ikisiyle hem .de boş dizeyle eşleşiyor .
OrangeDog

1
@Gangnus ".digit" eşleşmesi gerektiğini de söylemiyor. Bunu istiyorlarsa, söylemeliydiler.
OrangeDog

2
@EqualityInTech Ben öyle olmadığından eminim - hiç gruplaması yok.
OrangeDog

1
Hmm ... Sanırım sandığım gibi kötü normal ifadeleri tam olarak anlayamayabilirim. Afedersiniz.
JDB hala Monica'yı

1
@AlexanderRyanBaggett bu, sorunun belirttiği ile tam olarak eşleşir. Gördüğünüz gibi hiç içermiyor -.
OrangeDog

74

Doğru şekilde yapmak için aşağıdaki gibi normal bir ifadeye ihtiyacınız var:

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

Genişletilmiş değiştiriciyi kullanan beyaz boşluklarla aynı ifade (Perl tarafından desteklendiği şekilde):

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

veya yorumlarla:

/^           # Beginning of string
 [+-]?       # Optional plus or minus character
 (           # Followed by either:
   (           #   Start of first option
     \d+       #   One or more digits
     (\.\d*)?  #   Optionally followed by: one decimal point and zero or more digits
   )           #   End of first option
   |           # or
   (\.\d+)     #   One decimal point followed by one or more digits
 )           # End of grouping of the OR options
 $           # End of string (i.e. no extra characters remaining)
 /x          # Extended modifier (allows whitespace & comments in regular expression)

Örneğin, eşleşecek:

  • 123
  • 23.45
  • 34.
  • .45
  • -123
  • -273.15
  • -42.
  • -.45
  • 516
  • 9,8
  • 2.
  • +.5

Ve bu sayı olmayanları reddedecek:

  • . (tek ondalık nokta)
  • -. (negatif ondalık nokta)
  • +. (artı ondalık nokta)
  • (boş dize)

Daha basit çözümler, hatalı olarak geçerli sayıları reddedebilir veya bu sayı olmayanlarla eşleşebilir.


1
En iyisidir çünkü bir sayı ve ardından nokta (42.) ile eşleşir. Bununla birlikte, şununla eşleştiği için bir hata / yanlış pozitif var: 3 .... 3, ^ $ başlangıç ​​ve bitiş karakterlerini zorlamak için iki parantez daha ekleyerek düzeltilebilir: / ^ ([+ -]? (\ D + (\ . \ d *)?) | (\. \ d +)) $ /
Pete Alvin

1
Teşekkürler Pete, iyi görüldü. Cevap, amaçlandığı gibi davranması için fazladan parantez eklenerek düzeltildi. Şimdi gibi yazılıyor ^A?(B|C)$. Daha önce, ^A?B|C$aslında (^A?B)|(C$)hangisinin yanlış olduğu anlamına geliyordu . Not: ^(A?B|C)$aynı zamanda yanlıştır, çünkü aslında ^((A?B)|(C))$"+.5" ile eşleşmeyeceği anlamına gelir .
Hoylen

2
Bu en iyi cevap. Diğer cevaplar tüm vakaları ele almıyor. Eksik basamak durumlarını ele almak için bir önden okuma kullanmam dışında ben de benzer bir şey yapıyorum: /🖤[+-]?(?=\d|\.\d)\d*(\.\d*)?$ /
PhilHarvey

1
Buradaki tek doğru normal ifade budur. Ama bazı insanlar "34" ile aynı fikirde değillerdi. *
Yerine

1
Bu aynı zamanda 0000.2 ile de eşleşir ve muhtemelen istenen bu değildir.
Aaron Zorel

12

Bu normal ifadeyi deneyin:

\d+\.?\d*

\ d + isteğe bağlı ondalıktan önceki rakamlar
.? isteğe bağlı ondalık (? nicelik belirteci nedeniyle isteğe bağlı)
\ d * ondalıktan sonra isteğe bağlı rakamlar


1
Hayır, bu eşleşmiyor123.
Bart Kiers

1
Not için teşekkürler. Normal ifademi değiştirdim.
Kash

4
Aslında, ama şimdi onu başka biri tarafından zaten gönderilmiş olana dönüştürdünüz. Başka bir "doğru" yanıtı kaldırmayı düşünün.
Bart Kiers

@BartKiers Bunu ekledim çünkü bahsettiğiniz yanıtın başında ek bir eğik çizgi var, bu yüzden benim için işe yaramadı. Bu işe yaradı.
Edison

@Edison eğik çizgi bir normal ifade sınırlayıcıdır: kalıbın bir parçası değildir. Bu sınırlayıcıları içeren birçok yanıt göreceksiniz.
Bart Kiers

10

Bence bu en iyisi çünkü tüm gereksinimleri karşılıyor:

^\d+(\\.\d+)?$

1
Benim için bu en iyi cevap, çünkü "4" dizesi. (örneğin) en azından Ruby dilinde geçerli bir sayı değildir. Ancak, en çok oy alan cevaplar "4" ü kabul eder. bir sayı normal ifadesi olarak, bu da yanlış.
Victor

3

Aşağıdakileri kullandım:

^\d*\.?\d+$

Bu, aşağıdakileri geçersiz kılar:

.
3.

Hangi dili kullandığınıza bağlı olarak eğik çizgiye ihtiyacınız olabilir. Örneğin: / renew\d*\.?\d+$/
Charles Naccio

bu izin verecek.3
Royi Namir

3

bunu kullanabilirsiniz:

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

maçlar:
11
11.1
0.2

eşleşmiyor:
.2
2.
2.6.9


Teşekkürler, çok basit ve ihtiyacım olan şeyle eşleşiyor
Hany


2

Ben öyle yaptım. Yukarıdakilerin herhangi birinden daha katı (ve bazılarından daha doğru):

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

Geçen dizeler:

0
0.
1
123
123.
123.4
.0
.0123
.123
0.123
1.234
12.34

Başarısız olan dizeler:

.
00000
01
.0.
..
00.123
02.134

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

insanların genellikle iyi biçimlendirilmiş bir ondalık sayı olarak düşündüklerini yansıtmalıdır.

Ondalık noktadan önceki rakamlar tek bir rakam olabilir, bu durumda 0 ile 9 arasında veya birden fazla rakam olabilir, bu durumda 0 ile başlayamaz.

Ondalık işaretinin önünde herhangi bir rakam varsa, ondalık ve onu izleyen rakamlar isteğe bağlıdır. Aksi takdirde, bir ondalık sayı ve ardından en az bir rakam bulunmalıdır. Ondalık noktadan sonra birden fazla sondaki 0'a izin verildiğini unutmayın.

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

aşağıdakilerle doğru şekilde eşleşir:

9
0
10
10.
0.
0.0
0.100
0.10
0.01
10.0
10.10
.0
.1
.00
.100
.001

imzalı muadillerinin yanı sıra aşağıdakileri reddeder:

.
00
01
00.0
01.3

ve bunların imzalı eşdeğerleri ve boş dize.


1
(?<![^d])\d+(?:\.\d+)?(?![^d])

temiz ve basit.

Bu, Sonek ve Önek, RegEx özelliklerini kullanır.

IsMatch koşulu için doğrudan doğru - yanlış döndürür


1
^\d+(()|(\.\d+)?)$

Bununla geldi. Hem tam sayıya hem de ondalık sayıya izin verir, ancak ondalık sayı girmeye karar verirseniz tam bir ondalık (baştaki ve sondaki sayılar) zorlar.


1

İstediğiniz şey zaten yanıtlanmış, bu nedenle bu, isteğe bağlı ondalık nokta girilirse yalnızca 2 ondalık basamak isteyenler için ek bir bilgidir:

^\d+(\.\d{2})?$

^: dizenin başlangıcı
\ d: bir rakam ([0-9] 'a eşit)
+: bir ve sınırsız kez

Grup (. \ D {2}) Yakalanıyor mu?
? : sıfır ve bir kez. : karakter.
\ d: bir rakam ([0-9] 'a eşittir)
{2}: tam olarak 2 kere
$: dizenin sonu

1: eşleşme
123: eşleşme
123.00 : eşleşme 123.: eşleşme
yok
123 ..: eşleşme yok
123.0: eşleşme yok
123.000: eşleşme yok
123.00.00: eşleşme yok


Bu negatif sayılarla eşleşiyor mu?
Alexander Ryan Baggett

1
@AlexanderRyanBaggett Negatif işaretini kontrol etmeniz gerekir, böylece: ^ -? \ D + (\. \ D {2})? $
PersyJack

0

Perl'de, belirli sayı formatınız için ince ayarlanmış bir düzenli ifade oluşturmanıza izin verecek Regexp :: Common kullanın. Perl kullanmıyorsanız, üretilen normal ifade yine de diğer diller tarafından kullanılabilir.

Regexp :: Common :: Number'da örnek düzenli ifadeler oluşturmanın sonucunu yazdırma:

$ perl -MRegexp::Common=number -E 'say $RE{num}{int}'
(?:(?:[-+]?)(?:[0123456789]+))

$ perl -MRegexp::Common=number -E 'say $RE{num}{real}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789])(?:[0123456789]*)(?:(?:[.])(?:[0123456789]{0,}))?)(?:(?:[E])(?:(?:[-+]?)(?:[0123456789]+))|))

$ perl -MRegexp::Common=number -E 'say $RE{num}{real}{-base=>16}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789ABCDEF])(?:[0123456789ABCDEF]*)(?:(?:[.])(?:[0123456789ABCDEF]{0,}))?)(?:(?:[G])(?:(?:[-+]?)(?:[0123456789ABCDEF]+))|))

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.