Yanıtlar:
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
/^\d*\.?\d+$/
Ondalık noktadan sonra bir rakamı zorlayan daha iyi bir normal ifade olacaktır .
/\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*$/
.
de boş dizeyle eşleşiyor .
-
.
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:
Ve bu sayı olmayanları reddedecek:
Daha basit çözümler, hatalı olarak geçerli sayıları reddedebilir veya bu sayı olmayanlarla eşleşebilir.
^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 .
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
123.
Bence bu en iyisi çünkü tüm gereksinimleri karşılıyor:
^\d+(\\.\d+)?$
Aşağıdakileri kullandım:
^\d*\.?\d+$
Bu, aşağıdakileri geçersiz kılar:
.
3.
.3
bunu kullanabilirsiniz:
^\d+(\.\d)?\d*$
maçlar:
11
11.1
0.2
eşleşmiyor:
.2
2.
2.6.9
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
^[+-]?(([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.
(?<![^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
^\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.
İ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
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]+))|))
bunu dene. ^[0-9]\d{0,9}(\.\d{1,3})?%?$
benim için test edildi ve çalıştı.