Antworten:
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
/^\d*\.?\d+$/
der eine Ziffer nach einem Dezimalpunkt erzwingen würde.
/\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*$/
.
und der leeren Zeichenfolge überein .
-
.
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:
Und wird diese Nicht-Zahlen ablehnen:
Die einfacheren Lösungen können gültige Zahlen falsch ablehnen oder mit diesen Nicht-Zahlen übereinstimmen.
^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.
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
123.
Ich denke, dies ist das beste, weil es allen Anforderungen entspricht:
^\d+(\\.\d+)?$
Am Ende habe ich Folgendes verwendet:
^\d*\.?\d+$
Dies macht Folgendes ungültig:
.
3.
.3
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
Sie können dies verwenden:
^\d+(\.\d)?\d*$
Übereinstimmungen:
11
11,1
0,2
stimmt nicht überein:
.2
2.
2.6.9
^[+-]?(([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.
(?<![^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
^\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.
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
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]+))|))
Versuche dies. ^[0-9]\d{0,9}(\.\d{1,3})?%?$
es ist für mich getestet und funktioniert.