Wartości dziesiętne lub liczbowe w sprawdzaniu poprawności wyrażeń regularnych
Próbuję użyć sprawdzania poprawności wyrażenia regularnego, aby sprawdzić tylko wartości dziesiętne lub wartości liczbowe. Ale użytkownik wprowadza wartość liczbową, nie jest to pierwsza cyfra " 0 "
Jak to zrobić?
10 answers
Cyfra z zakresu 1-9, po której następuje zero lub więcej innych cyfr:
^[1-9]\d*$
Aby umożliwić liczby z opcjonalnym punktem dziesiętnym, po którym następują cyfry. Cyfra z zakresu 1-9, po której następuje zero lub więcej innych cyfr, a następnie opcjonalnie punkt dziesiętny, po którym następuje co najmniej 1 cyfra:
^[1-9]\d*(\.\d+)?$
Uwagi:
-
^
i$
zakotwiczenie na początku i końcu w zasadzie mówiące, że cały łańcuch musi pasować do wzór -
()?
pasuje 0 LUB 1 z całości między nawiasami
Aktualizacja obsługi przecinków:
W wyrażeniach regularnych .
ma specjalne znaczenie-pasuje do każdego pojedynczego znaku. Aby dopasować dosłownie .
w łańcuchu musisz uciec .
używając \.
to jest znaczenie \.
w wyrażeniu regularnym powyżej. Więc jeśli chcesz zamiast tego użyć przecinka, wzór jest po prostu:
^[1-9]\d*(,\d+)?$
Dalsza aktualizacja do obsługi przecinków i kropek
Jeśli chcesz zezwolić na . pomiędzy grupami cyfr i a , między całką a częścią ułamkową spróbuj:
^[1-9]\d{0,2}(\.\d{3})*(,\d+)?$
Tzn. jest to cyfra w zakresie 1-9, po której następuje do 2 innych cyfr, a następnie zero lub więcej grup kropki, a następnie 3 cyfry, a następnie opcjonalnie przecinek i cyfry, jak wcześniej.
Jeśli chcesz zezwolić na . gdziekolwiek pomiędzy cyframi wtedy spróbuj:
^[1-9][\.\d]*(,\d+)?$
Tzn. cyfra 1-9, po której następuje zero lub więcej cyfr lub kropki opcjonalnie, po których następuje przecinek i jedna lub więcej cyfr.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-11 20:33:59
Właściwie żadna z udzielonych odpowiedzi nie pokrywa w pełni żądania.
Ponieważ OP nie dostarczył konkretnych przypadków użycia lub typów liczb, postaram się opisać wszystkie możliwe przypadki i permutacje.
Liczby Regularne
Cały Pozytywny
Liczba ta jest zwykle nazywana unsigned integer , ale można ją również nazwać dodatnią liczbą ułamkową, obejmującą zero. Obejmuje to liczby takie jak 0
, 1
i 99999
.
The Regular Wyrażenie obejmujące tę walidację to:
/^(0|[1-9]\d*)$/
Cały dodatni i ujemny
Liczba ta jest zwykle nazywana signed integer , ale można ją również nazwać liczbą ułamkową. Obejmuje to liczby takie jak 0
, 1
, 99999
, -99999
, -1
oraz -0
.
Wyrażenie regularne obejmujące tę walidację to:
/^-?(0|[1-9]\d*)$/
As you prawdopodobnie zauważyłem, że włączyłem również -0
jako poprawny numer. Ale niektórzy mogą spierać się z tym użyciem i powiedzieć, że nie jest to liczba rzeczywista (więcej na temat Signed Zero można przeczytać tutaj ). Tak więc, jeśli chcesz wykluczyć tę liczbę z tego wyrażenia regularnego, oto, czego powinieneś użyć zamiast tego:
/^-?(0|[1-9]\d*)(?<!-0)$/
Dodałem tylko (?<!-0)
, co oznacza, że nie włączam -0
przed tym twierdzeniem. To (?<!...)
twierdzenie zwane ujemne lookbehind , co oznacza, że dowolna fraza zastępuje ...
nie powinna pojawić się przed tym twierdzeniem. Lookbehind ma ograniczenia, np. wyrażenie nie może zawierać kwantyfikatorów. Dlatego w niektórych przypadkach będę używać Lookahead zamiast, który jest taki sam, ale w odwrotny sposób.
Wiele wyrażeń regex, włączając te używane przez Perla i Pythona, zezwala tylko na ciągi o stałej długości. Można używać tekstu literalnego, znaków specjalnych, znaków unikodowych innych niż
\X
i znaków klasy. Nie można używać kwantyfikatorów ani backreferencji. Możesz użyć alternacji, ale tylko wtedy, gdy wszystkie alternatywy mają tę samą długość. Te smaki oceniają lookbehind, najpierw przechodząc z powrotem przez temat ciągu Dla tak wielu znaków, jak lookbehind potrzebuje, a następnie próbuje regex wewnątrz lookbehind od lewej do prawej.
Więcej informacji na temat twierdzeń znajdziesz tutaj .
Ułamkowa Liczby
Pozytywny
Liczba ta jest zwykle nazywana unsigned float lub unsigned double , ale można ją również nazwać dodatnią liczbą ułamkową, obejmującą zero. Obejmuje to liczby takie jak 0
, 1
, 0.0
, 0.1
, 1.0
, 99999.000001
, 5.10
.
Wyrażenie regularne obejmujące tę walidację to:
/^(0|[1-9]\d*)(\.\d+)?$/
Niektórzy mogą powiedzieć, że liczby takie jak .1
, .0
i .00651
(tak samo jak 0.1
, 0.0
i 0.00651
) są również poprawnymi liczbami ułamkowymi i nie mogę się z nimi nie zgodzić. Oto więc regex, który dodatkowo obsługuje ten format:
/^(0|[1-9]\d*)?(\.\d+)?(?<=\d)$/
Negatywne i pozytywne
Liczba ta jest zwykle nazywana signed float lub signed double , ale można ją również nazwać liczbą ułamkową. Obejmuje to liczby takie jak 0
, 1
, 0.0
, 0.1
, 1.0
, 99999.000001
, 5.10
, -0
, -1
, -0.0
, -0.1
, -99999.000001
, 5.10
.
Wyrażenie regularne obejmujące tę walidację to:
/^-?(0|[1-9]\d*)(\.\d+)?$/
Dla Nie -0
wierzących:
/^(?!-0(\.0+)?$)-?(0|[1-9]\d*)(\.\d+)?$/
Dla tych, którzy chcą wspierać także niewidzialne reprezentacje zero, Jak .1
, -.1
, użyj następującego wyrażenia regularnego:
/^-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)$/
Połączenie nie -0
wierzących i invisible zero believers, use this regex:
/^(?!-0?(\.0+)?$)-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)$/
Liczby z notacją naukową (AKA notacja wykładnicza)
Niektórzy mogą chcieć wspierać w swoich walidacjach, liczby o charakterze naukowym e
, który jest przy okazji, absolutnie poprawny numer, jest tworzony dla krótko reprezentują bardzo długie liczby. Więcej o notacji naukowej można przeczytać tutaj . Liczby te zwykle wyglądają jak 1e3
(które na 1000
), 1e-3
(0.001) i są w pełni obsługiwane przez wiele głównych języków programowania (np. JavaScript). Możesz sprawdzić, czy wyrażenie '1e3'==1000
zwraca true
.
Podzielę poparcie dla wszystkich powyższych sekcji, w tym liczby z notacją naukową.
Liczby Regularne
Walidacja regex całej liczby dodatniej, obsługuje liczby takie jak 6e4
, 16e-10
, 0e0
ale także liczby regularne jak 0
, 11
:
/^(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i
Cała Walidacja regex liczby dodatniej i ujemnej, obsługuje liczby takie jak -6e4
, -16e-10
, -0e0
ale także regularne liczby takie jak -0
, -11
i wszystkie liczby dodatnie powyżej:
/^-?(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i
Cała dodatnia i ujemna Walidacja regex Dla Nie -0
wierzących, tak samo jak wyżej, z tym, że teraz zabrania liczb takich jak -0
, -0e0
, -0e5
oraz -0e-6
:
/^(?!-0)-?(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i
Liczby Ułamkowe
Poprawność Regex liczby dodatniej, obsługuje również liczby całkowite powyżej, plus liczby takie jak 0.1e3
, 56.0e-3
, 0.0e10
i 1.010e0
:
/^(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?$/i
Liczba dodatnia z niewidocznym zerem obsługuje walidację regex, obsługuje również powyższe liczby dodatnie, dodatkowo liczby takie jak .1e3
, .0e0
, .0e-5
oraz .1e-7
:
/^(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?$/i
Weryfikacja Regex liczb ujemnych i dodatnich, obsługuje powyższe liczby dodatnie, ale także liczby takie jak -0e3
, -0.1e0
, -56.0e-3
i -0.0e10
:
/^-?(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?$/i
Negative and positive number regex validation for non -0
believers, same as the above, except now it zakazuje liczb takich jak -0
, -0.00000
, -0.0e0
, -0.00000e5
i -0e-6
:
/^(?!-0(\.0+)?(e|$))-?(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?$/i
Liczba ujemna i dodatnia z niewidocznym zerem obsługuje walidację regex, obsługuje również powyższe liczby dodatnie i ujemne, dodatkowo liczby takie jak -.1e3
, -.0e0
, -.0e-5
i -.1e-7
:
/^-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?$/i
Liczba ujemna i dodatnia z kombinacją Nie -0
wierzących i niewidzialnych zero wierzących, tak samo jak wyżej, ale zabrania liczb takich jak -.0e0
, -.0000e15
oraz -.0e-19
:
/^(?!-0?(\.0+)?(e|$))-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?$/i
Liczby z reprezentacją szesnastkową
W wielu językach programowania ciąg znaków liczby szesnastkowej, jak 0x4F7A
, może być łatwo rzucany do liczby dziesiętnej 20346
.
Tak więc, można chcieć go wspierać w swoim skrypcie walidacji.
Poniższe Wyrażenie regularne obsługuje tylko reprezentacje liczb szesnastkowych:
/^0x[0-9a-f]+$/i
Wszystkie Permutacje
Te ostateczne wyrażenia regularne obsługują niewidoczne liczby zerowe.
Signed Zero Believers
/^(-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?|0x[0-9a-f]+)$/i
Non Signed Zero Believers
/^((?!-0?(\.0+)?(e|$))-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?|0x[0-9a-f]+)$/i
Mam nadzieję, że omówiłem wszystkie permutacje liczb, które są obsługiwane w wielu językach programowania.
Powodzenia!
Och, zapomniałem wspomnieć, że ci, którzy chcą zatwierdzić numer obejmuje separator tysiąca, powinieneś najpierw wyczyścić wszystkie przecinki (,
), ponieważ może istnieć dowolny rodzaj separatora, nie możesz pokryć ich wszystkich.
Ale możesz je najpierw usunąć, przed zatwierdzeniem numeru:
//JavaScript
function clearSeparators(number)
{
return number.replace(/,/g,'');
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-01 08:05:15
Miałem ten sam problem, ale też chciałem".25" to prawidłowa liczba dziesiętna. Oto moje rozwiązanie przy użyciu JavaScript:
function isNumber(v) {
// [0-9]* Zero or more digits between 0 and 9 (This allows .25 to be considered valid.)
// ()? Matches 0 or 1 things in the parentheses. (Allows for an optional decimal point)
// Decimal point escaped with \.
// If a decimal point does exist, it must be followed by 1 or more digits [0-9]
// \d and [0-9] are equivalent
// ^ and $ anchor the endpoints so tthe whole string must match.
return v.trim().length > 0 && v.trim().match(/^[0-9]*(\.[0-9]+)?$/);
}
Gdzie moja metoda trim () to
String.prototype.trim = function() {
return this.replace(/(^\s*|\s*$)/g, "");
};
Matthew DesVoigne
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-04 20:18:20
Przetestowałem wszystkie podane wyrażenia regularne, ale niestety żaden z nich nie przeszedł tych testów:
String []goodNums={"3","-3","0","0.0","1.0","0.1"};
String []badNums={"001","-00.2",".3","3.","a",""," ","-"," -1","--1","-.1","-0", "2..3", "2-", "2...3", "2.4.3", "5-6-7"};
Oto najlepsze co napisałem, że zdałem te wszystkie testy:
"^(-?0[.]\\d+)$|^(-?[1-9]+\\d*([.]\\d+)?)$|^0$"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-08 07:31:19
Oto wielki regex pracy dla liczb. Przyjmuje liczbę z przecinkami i dziesiętnymi.
/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-04 18:30:24
Oto mój regex do walidacji liczb:
^(-?[1-9]+\\d*([.]\\d+)?)$|^(-?0[.]\\d*[1-9]+)$|^0$
Poprawne numery:
String []validNumbers={"3","-3","0","0.0","1.0","0.1","0.0001","-555","94549870965"};
Nieprawidłowe liczby:
String []invalidNumbers={"a",""," ","-","001","-00.2","000.5",".3","3."," -1","--1","-.1","-0"};
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-05 15:33:21
Wypróbuj ten kod, mam nadzieję, że ci pomoże
String regex = "(\\d+)(\\.)?(\\d+)?"; for integer and decimal like 232 232.12
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-31 11:16:06
/([0-9]+[.,]*)+/
pasuje do dowolnej liczby z lub bez śpiączki lub kropek
Może pasować
122
122,354
122.88
112,262,123.7678
Bug: pasuje również 262.4377, 3883 (ale to nie ma znaczenia)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-17 12:18:44
Jeśli chcesz potwierdzić dziesiętne kropkami, przecinkami, pozytywami i negatywami, wypróbuj to:
Object testObject = "-1.5";
boolean isDecimal = Pattern.matches("^[\\+\\-]{0,1}[0-9]+[\\.\\,]{1}[0-9]+$", (CharSequence) testObject);
Powodzenia.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-17 14:22:12
Poniżej jest idealny dla wspomnianego wymogu:
^[0-9]{1,3}(,[0-9]{3})*(([\\.,]{1}[0-9]*)|())$
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-09 12:57:01