Regulärer Ausdruck mit Dezimalzahl, wobei Ziffer nach Dezimalstelle optional ist

112

Ich benötige einen regulären Ausdruck, der eine Zahl validiert, aber keine Ziffer nach der Dezimalstelle benötigt. dh.

123
123.
123.4

wäre alles gültig

123..

wäre ungültig

Jeder wäre sehr dankbar!

Trish
quelle
Die beste Antwort ist hier: stackoverflow.com/a/39399503/715269
Gangnus

Antworten:

189

Verwenden Sie Folgendes:

/^\d*\.?\d*$/
  • ^ - Beginn der Linie;
  • \d* - 0 oder mehr Ziffern;
  • \.?- Ein optionaler Punkt (maskiert, da in Regex .ein Sonderzeichen ist);
  • \d* - 0 oder mehr Stellen (der Dezimalteil);
  • $ - Ende der Zeile.

Dies ermöglicht eine Dezimalstelle von 0,5, anstatt die führende Null zu erfordern, z. B. 0,5

João Silva
quelle
2
@OrangeDog, Ihr Original passt mehr als gewünscht. zB 'cow3.45tornado';)
S. Albano
39
Es stimmt auch mit einem einzelnen Punkt überein, der keine gültige Dezimalzahl ist. Ein besserer regulärer Ausdruck wäre, /^\d*\.?\d+$/der eine Ziffer nach einem Dezimalpunkt erzwingen würde.
Chandranshu
2
@Chandranshu und es stimmt mit einer leeren Zeichenfolge überein, die Ihre Änderung auch lösen würde.
OGHaza
2
@Chandranshu "benötigt keine Ziffer nach der Dezimalstelle"
OrangeDog
3
Diese Lösung funktioniert nicht. Es erfordert Dezimalstellen, während OP eindeutig sagt: optionale Dezimalstellen.
Alex G
113
/\d+\.?\d*/

Eine oder mehrere Ziffern ( \d+), optionaler Punkt ( \.?), null oder mehrere Ziffern ()\d* ).

Abhängig von Ihrer Verwendung oder Regex-Engine müssen Sie möglicherweise Start- / Endlinienanker hinzufügen:

/^\d+\.?\d*$/

Visualisierung regulärer Ausdrücke

Debuggex-Demo

OrangeDog
quelle
12
Ja, aber die Antwort mit der höchsten Bewertung ist falsch. Sie stimmt mit beiden .und der leeren Zeichenfolge überein .
OrangeDog
1
@ Gangnus Es heißt auch nicht, dass ".digit" übereinstimmen sollte. Wenn sie das wollten, hätten sie es sagen sollen.
OrangeDog
2
@EqualityInTech Ich bin mir ziemlich sicher, dass dies nicht der Fall ist - es gibt überhaupt keine Gruppierung.
OrangeDog
1
Hmm ... Ich glaube, ich verstehe böse Regexe möglicherweise nicht so gut, wie ich dachte. Es tut uns leid.
JDB erinnert sich noch an Monica
1
@AlexanderRyanBaggett dies entspricht genau der Frage. Wie Sie sehen können, ist es überhaupt nicht enthalten -.
OrangeDog
74

Sie benötigen einen regulären Ausdruck wie den folgenden, um es richtig zu machen:

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

Der gleiche Ausdruck mit Leerzeichen unter Verwendung des erweiterten Modifikators (wie von Perl unterstützt):

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

oder mit Kommentaren:

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

Zum Beispiel wird es übereinstimmen:

  • 123
  • 23.45
  • 34.
  • .45
  • -123
  • -273,15
  • -42.
  • -.45
  • +516
  • +9,8
  • +2.
  • +.5

Und wird diese Nicht-Zahlen ablehnen:

  • . (einzelner Dezimalpunkt)
  • -. (negativer Dezimalpunkt)
  • +. (plus Dezimalpunkt)
  • (leerer String)

Die einfacheren Lösungen können gültige Zahlen falsch ablehnen oder mit diesen Nicht-Zahlen übereinstimmen.

Hoylen
quelle
1
Am besten, weil es mit einer Zahl übereinstimmt, gefolgt von einem Punkt (42.). Es gibt jedoch einen Fehler / ein falsches Positiv, der mit diesem übereinstimmt: 3 .... 3, der behoben werden kann, indem zwei weitere Klammern hinzugefügt werden, um ^ $ Anfangs- und Endzeichen zu erzwingen: / ^ ([+ -]? (\ D + (\ . \ d *)?) | (\. \ d +)) $ /
Pete Alvin
1
Danke Pete, gut gesehen. Die Antwort wurde jetzt korrigiert, indem zusätzliche Klammern hinzugefügt wurden, damit sie sich wie beabsichtigt verhält. Es ist jetzt wie geschrieben ^A?(B|C)$. Zuvor wurde es so geschrieben, ^A?B|C$was eigentlich bedeutet, (^A?B)|(C$)was falsch war. Hinweis: ^(A?B|C)$ist auch falsch, da es tatsächlich bedeutet ^((A?B)|(C))$, dass nicht "+.5" übereinstimmen würde.
Hoylen
2
Dies ist die beste Antwort. Die anderen Antworten behandeln nicht alle Fälle. Ich mache selbst etwas Ähnliches, außer dass ich einen Lookahead verwende, um die Fälle mit fehlenden Ziffern zu behandeln: /^[+-‹?(?=\d|\.\d)\d*(\.\d*)?$ /
PhilHarvey
1
Das ist hier die einzig richtige Regex. Aber einige Leute würden mit "34" nicht einverstanden sein. Ich würde + nach dem zweiten d anstelle von * vorschlagen
Gangnus
1
Dies entspricht auch 0000.2, was wahrscheinlich nicht erwünscht ist.
Aaron Zorel
11

Versuchen Sie diesen regulären Ausdruck:

\d+\.?\d*

\ d + Ziffern vor optionaler Dezimalstelle
.? optionale Dezimalstelle (optional aufgrund des Quantifizierers?)
\ d * optionale Ziffern nach der Dezimalstelle

Kash
quelle
1
Nein, das passt nicht zusammen123.
Bart Kiers
1
Danke für den Hinweis. Mein Regex wurde geändert.
Kash
4
In der Tat, aber jetzt haben Sie es einfach in das bearbeitet, was bereits von jemand anderem gepostet wurde. Ziehen Sie in Betracht, nur eine weitere "richtige" Antwort zu entfernen.
Bart Kiers
10

Ich denke, dies ist das beste, weil es allen Anforderungen entspricht:

^\d+(\\.\d+)?$
Luca Manzo
quelle
1
Für mich ist dies die beste Antwort, da der String: "4." (zum Beispiel) ist zumindest in Ruby-Sprache keine gültige Nummer. Die am besten bewerteten Antworten akzeptieren jedoch "4". als Zahl Regex, was falsch ist.
Victor
3

Am Ende habe ich Folgendes verwendet:

^\d*\.?\d+$

Dies macht Folgendes ungültig:

.
3.
Charles Naccio
quelle
Je nach verwendeter Sprache benötigen Sie möglicherweise Schrägstriche. Zum Beispiel: /^\d*\.?\d+$/
Charles Naccio
Dies wird ermöglichen.3
Royi Namir
2

Welche Sprache? Im Perl-Stil:^\d+(\.\d*)?$

Luis
quelle
2

Das habe ich getan. Es ist strenger als alle oben genannten (und korrekter als einige):

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

Saiten, die vergehen:

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

Zeichenfolgen, die fehlschlagen:

.
00000
01
.0.
..
00.123
02.134
Xiaohang James Miao
quelle
2

Sie können dies verwenden:

^\d+(\.\d)?\d*$

Übereinstimmungen:
11
11,1
0,2

stimmt nicht überein:
.2
2.
2.6.9

Ahmed Abdulkafy
quelle
Danke, sehr einfach und passt zu dem, was ich brauche
Hany
2
^[+-]?(([1-9][0-9]*)?[0-9](\.[0-9]*)?|\.[0-9]+)$

sollte widerspiegeln, was die Leute normalerweise als wohlgeformte Dezimalzahl betrachten.

Die Ziffern vor dem Dezimalpunkt können entweder eine einzelne Ziffer sein, in diesem Fall kann sie zwischen 0 und 9 liegen, oder mehr als eine Ziffer. In diesem Fall kann sie nicht mit einer 0 beginnen.

Wenn vor dem Dezimalzeichen Ziffern vorhanden sind, sind die Dezimalstelle und die darauf folgenden Ziffern optional. Andernfalls muss eine Dezimalstelle gefolgt von mindestens einer Ziffer vorhanden sein. Beachten Sie, dass nach dem Dezimalpunkt mehrere nachgestellte Nullen zulässig sind.

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

stimmt korrekt mit Folgendem überein:

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

sowie ihre signierten Äquivalente, während es Folgendes ablehnt:

.
00
01
00.0
01.3

und ihre signierten Äquivalente sowie die leere Zeichenfolge.

Aaron Zorel
quelle
1
(?<![^d])\d+(?:\.\d+)?(?![^d])

sauber und einfach.

Dies verwendet die Funktionen Suffix und Präfix, RegEx.

Es gibt direkt true - false für die IsMatch-Bedingung zurück

Prashant P.
quelle
1
^\d+(()|(\.\d+)?)$

Kam damit auf. Ermöglicht sowohl Ganzzahlen als auch Dezimalzahlen, erzwingt jedoch eine vollständige Dezimalzahl (führende und nachfolgende Zahlen), wenn Sie eine Dezimalzahl eingeben.

cvanniekerk
quelle
1

Was Sie gefragt haben, ist bereits beantwortet, daher ist dies nur eine zusätzliche Information für diejenigen, die nur 2 Dezimalstellen möchten, wenn ein optionaler Dezimalpunkt eingegeben wird:

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

^: Anfang der Zeichenfolge
\ d: eine Ziffer (gleich [0-9])
+: ein und unbegrenzt oft

Gruppe erfassen (. \ D {2})?
? : null und einmal. : Charakter.
\ d: eine Ziffer (gleich [0-9])
{2}: genau 2 mal
$: Ende der Zeichenfolge

1: Match
123: Match
123.00: Match
123.: kein Match
123 ..: kein Match
123.0: kein Match
123.000: kein Match
123.00.00: kein Match

PersyJack
quelle
Entspricht dies negativen Zahlen?
Alexander Ryan Baggett
1
@AlexanderRyanBaggett Sie müssen nach dem negativen Vorzeichen suchen, damit es lautet: ^ -? \ D + (\. \ D {2})? $
PersyJack
0

Verwenden Sie in Perl Regexp :: Common, mit dem Sie einen fein abgestimmten regulären Ausdruck für Ihr bestimmtes Zahlenformat zusammenstellen können. Wenn Sie Perl nicht verwenden, kann der generierte reguläre Ausdruck normalerweise noch von anderen Sprachen verwendet werden.

Drucken des Ergebnisses der Generierung der regulären Beispielausdrücke in 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]+))|))
pndc
quelle
0

Versuche dies. ^[0-9]\d{0,9}(\.\d{1,3})?%?$es ist für mich getestet und funktioniert.

Lawrence Eagles
quelle