Odpowiedzi:
Użyj następujących:
/^\d*\.?\d*$/
^
- początek linii;\d*
- 0 lub więcej cyfr;\.?
- Opcjonalna kropka (ze .
znakiem ucieczki, ponieważ w wyrażeniu regularnym jest znakiem specjalnym);\d*
- 0 lub więcej cyfr (część dziesiętna);$
- Koniec kolejki.Pozwala to na dziesiętne 0,5 zamiast wymagania wiodącego zera, takiego jak 0,5
/^\d*\.?\d+$/
wymuszenie cyfry po przecinku.
/\d+\.?\d*/
Jedna lub więcej cyfr ( \d+
), opcjonalna kropka ( \.?
), zero lub więcej cyfr ( \d*
).
W zależności od zastosowania lub silnika wyrażeń regularnych może być konieczne dodanie kotwic linii początkowej / końcowej:
/^\d+\.?\d*$/
.
i do pustego ciągu.
-
.
Aby zrobić to poprawnie, potrzebujesz wyrażenia regularnego, takiego jak poniższe:
/^[+-]?((\d+(\.\d*)?)|(\.\d+))$/
To samo wyrażenie z białymi znakami, przy użyciu rozszerzonego modyfikatora (obsługiwanego przez Perl):
/^ [+-]? ( (\d+ (\.\d*)?) | (\.\d+) ) $/x
lub z komentarzami:
/^ # 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)
Na przykład będzie pasować:
I odrzuci te nieliczby:
Prostsze rozwiązania mogą nieprawidłowo odrzucić prawidłowe liczby lub dopasować te nieliczbowe.
^A?(B|C)$
. Wcześniej było napisane, ^A?B|C$
co właściwie oznacza, (^A?B)|(C$)
co było niepoprawne. Uwaga: ^(A?B|C)$
jest również niepoprawne, ponieważ w rzeczywistości oznacza, ^((A?B)|(C))$
że nie pasuje do „+.5”.
Wypróbuj to wyrażenie regularne:
\d+\.?\d*
\ d + cyfry przed opcjonalnym dziesiętnym
.? opcjonalny dziesiętny (opcjonalny ze względu na kwantyfikator?)
\ d * opcjonalne cyfry po przecinku
123.
Myślę, że ten jest najlepszy, ponieważ spełnia wszystkie wymagania:
^\d+(\\.\d+)?$
Skończyło się na tym, że użyłem:
^\d*\.?\d+$
To sprawia, że następujące informacje są nieważne:
.
3.
.3
możesz użyć tego:
^\d+(\.\d)?\d*$
mecze:
11
11,1
0,2
nie pasuje:
.2
2.
2.6.9
To właśnie zrobiłem. Jest bardziej rygorystyczny niż którykolwiek z powyższych (i bardziej poprawny niż niektóre):
^0$|^[1-9]\d*$|^\.\d+$|^0\.\d*$|^[1-9]\d*\.\d*$
Ciągi, które przechodzą:
0
0.
1
123
123.
123.4
.0
.0123
.123
0.123
1.234
12.34
Ciągi, które zawodzą:
.
00000
01
.0.
..
00.123
02.134
^[+-]?(([1-9][0-9]*)?[0-9](\.[0-9]*)?|\.[0-9]+)$
powinien odzwierciedlać to, co ludzie zwykle myślą jako o dobrze sformułowanej liczbie dziesiętnej.
Cyfry przed kropką dziesiętną mogą być jedną cyfrą, w tym przypadku od 0 do 9, lub więcej niż jedną cyfrą, w którym to przypadku nie może zaczynać się od 0.
Jeśli przed znakiem dziesiętnym znajdują się jakieś cyfry, to cyfra dziesiętna i kolejne cyfry są opcjonalne. W przeciwnym razie musi być obecny przecinek, a po nim co najmniej jedna cyfra. Zauważ, że po przecinku dozwolone jest wielokrotne zerowanie na końcu.
grep -E '^[+-]?(([1-9][0-9]*)?[0-9](\.[0-9]*)?|\.[0-9]+)$'
poprawnie pasuje do następujących:
9
0
10
10.
0.
0.0
0.100
0.10
0.01
10.0
10.10
.0
.1
.00
.100
.001
a także ich podpisane odpowiedniki, a odrzuca:
.
00
01
00.0
01.3
i ich podpisane odpowiedniki, a także pusty ciąg.
(?<![^d])\d+(?:\.\d+)?(?![^d])
czyste i proste.
Wykorzystuje sufiks i prefiks, funkcje RegEx.
Bezpośrednio zwraca true - false dla warunku IsMatch
^\d+(()|(\.\d+)?)$
Przyszedł z tym. Zezwala na liczby całkowite i dziesiętne, ale wymusza pełne miejsce dziesiętne (początkowe i końcowe), jeśli zdecydujesz się wprowadzić liczbę dziesiętną.
Na to, o co pytałeś, już odpowiedziano, więc to tylko dodatkowa informacja dla tych, którzy chcą tylko 2 cyfry dziesiętne, jeśli wprowadzono opcjonalny przecinek dziesiętny:
^\d+(\.\d{2})?$
^: początek ciągu
\ d: cyfra (równa [0-9])
+: jeden i nieograniczona liczba razy
Grupa przechwytująca (. \ D {2})?
? : zero i jeden raz. : postać .
\ d: cyfra (równa [0-9])
{2}: dokładnie 2 razy
$: koniec ciągu
1: dopasowanie
123: dopasowanie
123.00: dopasowanie
123.: brak dopasowania
123 ..: brak dopasowania
123.0: brak dopasowania
123.000: brak dopasowania
123.00.00: brak dopasowania
W Perlu użyj Regexp :: Common, który pozwoli ci stworzyć precyzyjnie dostrojone wyrażenie regularne dla twojego konkretnego formatu liczb. Jeśli nie używasz Perla, wygenerowane wyrażenie regularne może być nadal używane w innych językach.
Drukowanie wyniku wygenerowania przykładowych wyrażeń regularnych w Regexp :: Common :: Number:
$ 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]+))|))
Spróbuj tego. ^[0-9]\d{0,9}(\.\d{1,3})?%?$
jest przetestowany i działa dla mnie.