2008-10-06 3 views
7

Ich versuche Floating-Point-Dezimalzahlen mit einem regulären Ausdruck zu vergleichen. Es kann eine Zahl vor dem Dezimaltrennzeichen geben oder auch nicht, und das Dezimaltrennzeichen kann vorhanden sein oder nicht, und wenn es vorhanden ist, kann es Ziffern haben oder nicht. (Für diese Anwendung ist ein vorangestelltes +/- oder ein nacheilendes "E123" nicht zulässig).Wie kann ich überprüfen, ob mindestens einer von zwei Unterausdrücken in einem regulären Ausdruck übereinstimmt?

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

Welche richtig die folgenden Spiele:: Ich habe diese regex geschrieben

1 
1. 
1.23 
.23 

Dies ist jedoch auch Spiele leere Zeichenfolge oder eine Zeichenfolge von nur einem Komma, das will ich nicht.

Derzeit überprüfe ich nach dem Ausführen der Regex, dass $ 1 oder $ 3 Länge größer als 0 hat. Wenn nicht, ist es nicht gültig. Gibt es einen Weg, wie ich das direkt in der Regex machen kann?

+0

ich eigentlich tun Es ist in Java, aber ich poste es hier, als wäre es Perl, weil Java Regex-Engine ist ist eine Beleidigung der menschlichen Anständigkeit. – Kip

Antwort

6

Ich denke, das wird tun, was Sie wollen. Es beginnt entweder mit einer Ziffer, in diesem Fall ist der Dezimalpunkt und Ziffern danach optional, oder es beginnt mit einem Dezimalpunkt, in diesem Fall ist mindestens eine Ziffer danach obligatorisch.

/^\d+(\.\d*)?|\.\d+$/ 
+0

Welche Entschuldigung Regex-Engine unterstützt nicht +? Ich habe mir die Freiheit genommen, den Code zu ändern, was Sie hätten, wenn Sie sicher wären, dass + unterstützt wurde. –

+0

Ich dachte an einige Versionen von grep, sed und ed, aber das Original-Poster verwendet wahrscheinlich etwas neueres. Es ist eine dieser Gewohnheiten, die man bei Leuten sieht, die mit Unix-Systemen angefangen haben, die keine GNU-Tools verwenden. Ich benutze auch zcat statt der Option -z zu tar. – Glomek

0

Erstellen Sie einen regulären Ausdruck für jeden Fall und OR sie. Dann brauchen Sie nur zu testen, wenn der Ausdruck übereinstimmt.

/^(\d+(\.\d*)?)|(\d*\.\d+)$/ 
1

Eine sehr späte Antwort, aber gerne beantworten, genommen von regular-expressions.info

[-+]?[\d]*\.?[\d]+? 

aktualisieren Diese [\d]*\.?[\d]+?|[\d]+\. werden Sie 1.

passend helfen http://regex101.com/r/lJ7fF4/7

+0

Fehler beim Abgleich von "1.", den ich in meiner App als gültig betrachten musste. – Kip

+0

@Kip aktualisiert meine Antwort –

+0

jetzt haben Sie meine ursprüngliche Regex neu geschrieben. :) Es stimmt mit einem leeren String und '.' überein, was ich zu lösen versuchte. Ich glaube nicht, dass es ohne eine "oder" Bedingung möglich ist. – Kip

Verwandte Themen