@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:
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.
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
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:
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.
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.
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
@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:
Antworten:
Verwenden Sie Folgendes:
^
- 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
quelle
/^\d*\.?\d+$/
der eine Ziffer nach einem Dezimalpunkt erzwingen würde.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:
Debuggex-Demo
quelle
.
und der leeren Zeichenfolge überein .-
.Sie benötigen einen regulären Ausdruck wie den folgenden, um es richtig zu machen:
Der gleiche Ausdruck mit Leerzeichen unter Verwendung des erweiterten Modifikators (wie von Perl unterstützt):
oder mit Kommentaren:
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.
quelle
^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:
quelle
123.
Ich denke, dies ist das beste, weil es allen Anforderungen entspricht:
quelle
Am Ende habe ich Folgendes verwendet:
Dies macht Folgendes ungültig:
quelle
.3
Welche Sprache? Im Perl-Stil:
^\d+(\.\d*)?$
quelle
Das habe ich getan. Es ist strenger als alle oben genannten (und korrekter als einige):
Saiten, die vergehen:
Zeichenfolgen, die fehlschlagen:
quelle
Sie können dies verwenden:
Übereinstimmungen:
11
11,1
0,2
stimmt nicht überein:
.2
2.
2.6.9
quelle
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.
stimmt korrekt mit Folgendem überein:
sowie ihre signierten Äquivalente, während es Folgendes ablehnt:
und ihre signierten Äquivalente sowie die leere Zeichenfolge.
quelle
sauber und einfach.
Dies verwendet die Funktionen Suffix und Präfix, RegEx.
Es gibt direkt true - false für die IsMatch-Bedingung zurück
quelle
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.
quelle
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:
^: 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
quelle
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:
quelle
Versuche dies.
^[0-9]\d{0,9}(\.\d{1,3})?%?$
es ist für mich getestet und funktioniert.quelle