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ć?

Author: skaffman, 2010-05-11

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.

 108
Author: mikej,
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*)$/

Test Ten Regex

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*)$/

Test Ten Regex

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)$/

Test Ten Regex

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+)?$/

Test Ten Regex

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)$/

Test Ten Regex

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+)?$/

Test Ten Regex

Dla Nie -0 wierzących:

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

Test Ten Regex

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)$/

Test Ten Regex

Połączenie nie -0 wierzących i invisible zero believers, use this regex:

/^(?!-0?(\.0+)?$)-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)$/

Test Ten Regex

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

Test Ten Regex

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

Test Ten Regex

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

Test Ten Regex

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

Test Ten Regex

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

Test Ten Regex

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

Test Ten Regex

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

Sprawdź To Regex

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

Test Ten Regex

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

Test Ten Regex

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

Test Ten Regex

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

Test Ten Regex

Non Signed Zero Believers

/^((?!-0?(\.0+)?(e|$))-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?|0x[0-9a-f]+)$/i

Test Ten Regex

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,'');
}
 51
Author: Slavik Meltser,
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

 7
Author: Matt 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$"

Tutaj wpisz opis obrazka

 6
Author: Nikita Kurtin,
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+)?$/
 2
Author: zeros-and-ones,
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"};
 1
Author: Marina K.,
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 
 1
Author: biswajit bastia,
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)

 1
Author: Satheesh Kumar,
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.
 0
Author: august0490,
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]*)|())$
 0
Author: Snehal Masne,
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