Expresie regulată pentru numere zecimale, unde cifra după zecimală este opțională (Programare, Regex)

Trish a intrebat.

Am nevoie de o expresie regulată care validează un număr, dar nu necesită o cifră după zecimală.adică.

123
123.
123.4

ar fi toate valide

123..

ar fi invalidă

Orice ar fi foarte apreciat!

Comentarii

  • Cel mai bun răspuns este aici: stackoverflow.com/a/39399503/715269.  > Por Gangnus.
15 răspunsuri
João Silva

Utilizați următoarele:

/^d*.?d*$/
  • ^ – Început de linie;
  • d* – 0 sau mai multe cifre;
  • .? – Un punct opțional (scăpat, pentru că în regex, . este un caracter special);
  • d* – 0 sau mai multe cifre (partea zecimală);
  • $ – Sfârșitul liniei.

Acest lucru permite o zecimală de 0,5, în loc să fie nevoie de un zero în față, cum ar fi 0,5.

Comentarii

  • @OrangeDog, originalul tău se potrivește mai mult decât ar fi de dorit. de exemplu, „cow3.45tornado” 😉 –  > Por S. Albano.
  • 43

  • De asemenea, se potrivește și cu un singur punct, care nu este un număr zecimal valid. Un regex mai bun ar fi /^d*.?d+$/ care ar forța o cifră după o virgulă zecimală. –  > Por Chandranshu.
  • @Chandranshu și se potrivește cu un șir de caractere gol, ceea ce ar fi rezolvat și prin modificarea ta. –  > Por OGHaza.
  • @Chandranshu „nu necesită o cifră după zecimală” –  > Por OrangeDog.
  • Această soluție nu funcționează. Necesită zecimale, în timp ce OP spune clar: zecimale opționale. –  > Por Alex G.
OrangeDog
/d+.?d*/

Una sau mai multe cifre (d+), punct opțional (.?), zero sau mai multe cifre (d*).

În funcție de utilizare sau de motorul regex, este posibil să fie nevoie să adăugați ancore de început/ sfârșit de linie:

/^d+.?d*$/

Debuggex Demo

Comentarii

  • Da, dar răspunsul votat de sus este greșit, se potrivește cu ambele . și cu șirul gol. –  > Por OrangeDog.
  • @Gangnus Nici nu scrie că „.digit” ar trebui să se potrivească. Dacă ar fi vrut asta, atunci ar fi trebuit să spună. –  > Por OrangeDog.
  • @EqualityInTech Sunt destul de sigur că nu este așa – nu are nicio grupare. –  > Por OrangeDog.
  • Hmm… Cred că s-ar putea să nu înțeleg pe deplin regexurile malefice așa cum am crezut că am făcut-o. Îmi pare rău. –  > Por JDB încă își amintește de Monica.
  • @AlexanderRyanBaggett acest lucru se potrivește exact cu ceea ce a specificat întrebarea. După cum puteți vedea, nu include - deloc. –  > Por OrangeDog.
Hoylen

Aveți nevoie de o expresie regulată ca următoarea pentru a face acest lucru în mod corespunzător:

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

Aceeași expresie cu spații albe, folosind modificatorul extins (așa cum este acceptat de Perl):

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

sau cu comentarii:

/^           # 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)

De exemplu, se va potrivi:

  • 123
  • 23.45
  • 34.
  • .45
  • -123
  • -273.15
  • -42.
  • -.45
  • +516
  • +9.8
  • +2.
  • +.5

Și va respinge aceste numere care nu sunt numere:

  • . (o singură zecimală)
  • -. (virgulă zecimală negativă)
  • +. (virgulă zecimală plus)
  • (șir gol)

Soluțiile mai simple pot respinge în mod incorect numere valide sau pot potrivi aceste numere care nu sunt numere.

Comentarii

  • Cel mai bun pentru că se potrivește cu un număr urmat de un punct (42.). Cu toate acestea, există o eroare/un fals pozitiv deoarece se potrivește cu acest număr: 3….3, care poate fi rezolvată prin adăugarea a încă două paranteze pentru a impune caracterele de început și sfârșit ^$: /^([+-]?(d+(.d*)?)|(.d+))$/ –  > Por Pete Alvin.
  • Mulțumesc Pete, bine observat. Răspunsul a fost corectat acum, prin adăugarea de paranteze suplimentare, astfel încât să se comporte așa cum era prevăzut. Acum este scris astfel ^A?(B|C)$. Anterior, a fost scris ca ^A?B|C$ ceea ce înseamnă de fapt (^A?B)|(C$) ceea ce era incorect. Notă: ^(A?B|C)$ este, de asemenea, incorectă, deoarece înseamnă de fapt ^((A?B)|(C))$ ceea ce nu s-ar potrivi cu „+.5”. –  > Por Hoylen.
  • Acesta este cel mai bun răspuns. Celelalte răspunsuri nu tratează toate cazurile. Eu însumi fac un lucru asemănător, cu excepția faptului că folosesc un „lookahead” pentru a gestiona cazurile de cifre lipsă: /^[+-]?(?=d|.d)d*(.d*)?$/ –  > Por PhilHarvey.
  • Acesta este singurul regex corect aici. Dar unii oameni nu ar fi de acord cu „34.”. Eu aș propune + după al doilea d în loc de *.  > Por Gangnus.
  • Acest lucru se potrivește și cu 0000.2, ceea ce probabil nu este ceea ce se dorește. –  > Por Aaron Zorel.
Kash

Încearcă acest regex:

d+.?d*

d+ cifre înaintea zecimalei opționale
.? opțional zecimale (opțional datorită cuantificatorului ?)
d* cifre opționale după zecimală

Comentarii

  • Nu, aceasta nu se potrivește 123. –  > Por Bart Kiers.
  • Vă mulțumim pentru notă. Mi-am modificat regex-ul. –  > Por Kash.
  • Într-adevăr, dar acum tocmai ai editat în ceea ce este deja postat de altcineva. Luați în considerare doar eliminarea unui alt răspuns „corect”. –  > Por Bart Kiers.
  • @BartKiers Am votat în sus acest lucru deoarece răspunsul la care te referi are o bară oblică suplimentară la început, așa că nu a funcționat pentru mine. Acest lucru a funcționat. –  > Por Edison.
  • @Edison acea bară oblică este un delimitator regex: nu face parte din modelul propriu-zis. Veți vedea multe răspunsuri care conțin acești delimitatori. –  > Por Bart Kiers.
Luca Manzo

Cred că acesta este cel mai bun, deoarece corespunde tuturor cerințelor:

^d+(\.d+)?$

Comentarii

  • Pentru mine, acesta este cel mai bun răspuns, deoarece șirul: „4.” (de exemplu) nu este un număr valid, cel puțin în limbajul ruby. Cu toate acestea, răspunsurile cele mai votate acceptă „4.” ca număr regex, ceea ce este greșit. –  > Por Victor.
Charles Naccio

Am ajuns să folosesc următoarele:

^d*.?d+$

Acest lucru face ca următoarele să fie invalide:

.
3.

Comentarii

  • Este posibil să aveți nevoie de slash-uri în funcție de limba pe care o utilizați. De exemplu: /^d*.?d+$/ –  > Por Charles Naccio.
Ahmed Abdulkafy

puteți folosi acest lucru:

^d+(.d)?d*$

matches:
11
11.1
0.2

nu se potrivește:
.2
2.
2.6.9

Comentarii

  • Mulțumesc, foarte simplu și corespunde cu ceea ce am nevoie –  > Por Hany.
Aaron Zorel
^[+-]?(([1-9][0-9]*)?[0-9](.[0-9]*)?|.[0-9]+)$

ar trebui să reflecte ceea ce oamenii consideră, de obicei, un număr zecimal bine format.

Cifrele dinaintea punctului zecimal pot fi fie o singură cifră, caz în care pot fi de la 0 la 9, fie mai multe cifre, caz în care nu pot începe cu 0.

În cazul în care există cifre înainte de semnul zecimal, atunci zecimala și cifrele care o urmează sunt opționale. În caz contrar, trebuie să fie prezentă o zecimală urmată de cel puțin o cifră. Rețineți că sunt permise mai multe zecimale cu 0 după virgulă.

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

se potrivește corect cu următoarele:

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

precum și echivalentele lor cu semn, în timp ce respinge următoarele:

.
00
01
00.0
01.3

și echivalentele lor semnate, precum și șirul gol.

Luis

Ce limbă? În stil Perl: ^d+(.d*)?$

Xiaohang James Miao

Iată ce am făcut. Este mai strict decât oricare dintre cele de mai sus (și mai corect decât unele):

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

Șiruri care trece:

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

Șiruri care nu trec:

.
00000
01
.0.
..
00.123
02.134

Prashant P
(?<![^d])d+(?:.d+)?(?![^d])

curat și simplu.

Aceasta folosește Suffix și Prefix, caracteristici RegEx.

Returnează direct true – false pentru condiția IsMatch.

cvanniekerk
^d+(()|(.d+)?)$

A venit cu asta. Permite atât numere întregi, cât și zecimale, dar forțează o zecimală completă (numere de început și de sfârșit) dacă decideți să introduceți o zecimală.

PersyJack

Ceea ce ați întrebat este deja răspuns, așa că aceasta este doar o informație suplimentară pentru cei care doresc doar 2 cifre zecimale dacă se introduce o zecimală opțională:

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

^ : începutul șirului
d : o cifră (egală cu [0-9])
+ : o dată și de un număr nelimitat de ori

Capturarea grupului (.d{2})?
? : de zero și unu ori. : caracter .
d : o cifră (egală cu [0-9])
{2} : exact de două ori
$ : sfârșitul șirului

1 : se potrivește
123 : se potrivește
123.00 : se potrivește
123.: nu se potrivește
123..: nu se potrivește
123.0 : nu se potrivește
123.000 : nu se potrivește
123.00.00 : nu se potrivește

Comentarii

  • Se potrivește cu numere negative? –  > Por Alexander Ryan Baggett.
  • @AlexanderRyanBaggett trebuie să verificați dacă există semnul negativ, deci ar trebui să fie: ^-?d+(.d{2})?$ –  > Por PersyJack.
pndc

În Perl, folosiți Regexp::Common, care vă va permite să asamblați o expresie regulată bine pusă la punct pentru formatul dvs. special de numere. Dacă nu folosiți Perl, expresia regulată generată poate fi utilizată în mod obișnuit și de alte limbaje.

Imprimarea rezultatului generării expresiilor regulate de exemplu în 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]+))|))

Lawrence Eagles

încercați acest lucru. ^[0-9]d{0,9}(.d{1,3})?%?$ este testat și a funcționat pentru mine.

Tags: