2013-11-22 12 views
5

Ich habe Schwierigkeiten, die richtige Regex für Dezimalzahlen zu finden, die das Kommatrennzeichen enthalten.Regex eine Dezimalzahl mit Komma

Ich habe ein paar andere Fragen zu diesem Thema im Allgemeinen aber keine der Antworten wirklich funktioniert finden, wenn ich sie getestet

Das Beste, was ich so weit gekommen ist:

[0-9]{1,3}(,([0-9]{3}))*(.[0-9]+)? 

2 Hauptprobleme so weit:

1) Es zeichnet Zahlen mit Leerzeichen zwischen ihnen auf "3001 1", statt sie in 2 Übereinstimmungen zu teilen "3001" "1" - Ich sehe nicht, wo ich Platz in der Regex erlaubte.

2) Ich habe ein generelles Problem mit dem Anfang \ Ende der Regex.

sollte die Regex:

3,001 
1 
32,012,111.2131 

aber nicht:

32,012,11.2131 
1132,012,111.2131 
32,0112,111.2131 
32131 

Außerdem mag ich würde es zum Spiel:

1.(without any number after it) 
1,(without any number after it) 
as 1 

(ein Komma oder Punkt, an dem Ende der Nummer sollte übersehen werden).

Vielen Dank! .

+0

Zunächst, wenn die Regex-Bibliothek Ihrer Sprache dies bereits tut, sollten Sie Ihr Muster wahrscheinlich an beiden Enden verankern. Andernfalls stimmt jede Zeichenfolge mit mindestens einer Ziffer überein. – cHao

+0

Sie haben Leerzeichen in der Regex mit dem Punkt ('' '.''') erlaubt, der zu jedem Zeichen passt. Entkomme dem Punkt ('' '\ .'''), um nur der Periode zu entsprechen. – creemama

+0

Ich glaube nicht, dass das zweite und dritte Problem überhaupt Probleme sind. Soweit ich das beurteilen kann, werden sie nicht mit dem übereinstimmen, was sie nicht sollen. –

Antwort

2

Dies ist ein sehr langer und verschachtelter Ausdruck, der alle Ihre Anforderungen erfüllt. Es funktioniert, wenn Ihre Regex-Engine auf PCRE basiert (hoffentlich verwenden Sie PHP, Delphi oder R ..).

(?<=[^\d,.]|^)\d{1,3}(,(\d{3}))*((?=[,.](\s|$))|(\.\d+)?(?=[^\d,.]|$)) 

DEMO on RegExr

Die Dinge, die es so lange zu machen:

  1. mehr Nummern auf der gleiche Zeile von nur 1 Zeichen (ein Raum) getrennt Passende während nicht erlaubt Teil Übertragungen erfordern einen Vorgriff- und ein Lookbehind.
  2. Übereinstimmende Nummern, die mit . und , enden, ohne die . oder , in das Spiel einbeziehen, erfordert ein anderes Lookahead.

(?=[,.](\s|$))Erklärung

Wenn diese Erklärung schriftlich erkannte ich die \s Bedürfnisse ein (\s|$) sein 1, einer Schnur am Ende passen.

Dieser Teil der Regex ist die 1 in 1, oder die 1,000 in 1,000. also lassen Sie uns 1,000. unsere Nummer sagen für den Abgleich (mit dem . am Ende).

Bis zu diesem Punkt auf die Regex 1,000 abgestimmt hat, dann kann es nicht eine andere , finden die Tausende Gruppe zu wiederholen, so dass es zu bewegt sich auf unsere (?=[,.](\s|$))

(?=....) bedeutet es ist ein Look-Ahead, das heißt, von wo aus wir haben abgestimmt, schau auf was kommt, aber füge es nicht zum Spiel hinzu.

So überprüft es, ob es eine , oder eine . gibt und wenn es ist, überprüft es, dass es sofort von Leerzeichen oder dem Ende der Eingabe folgt. In diesem Fall ist es, so würde es das Spiel verlassen als 1,000

Hätte der Lookahead nicht übereinstimmen, wäre es weiter zu versuchen, Dezimalstellen übereinzustimmen.

+0

Bisher scheint es gut zu funktionieren. Ich werde es ein bisschen mehr testen. Danke vielmals! Können Sie bitte erklären: (? = [,.] \ S)? – LiranBo

+0

Ah großartig, ich werde diese Erklärung zu der Antwort hinzufügen. – OGHaza

+0

Antwort aktualisiert - Ich musste auch eine kleine Änderung an der Regex vornehmen, um einen Randfall zu berücksichtigen. – OGHaza

1

Dies funktioniert für alle diejenigen, die Sie

^[0-9]{1,3}(,[0-9]{3})*(([\\.,]{1}[0-9]*)|())$ 
+0

mit den^$ -Tags gibt es nichts zurück. für die obigen Beispiele ohne es gibt mehr als ein paar Beispiele, die nicht übereinstimmen sollten. – LiranBo

0

. Mittel „beliebiges Zeichen“ aufgeführt haben. Um ein Literal . zu verwenden, entgehen Sie es wie folgt: \..

Soweit ich weiß, das ist das einzige, was fehlt.

+0

Er möchte mehrere Zahlen in der gleichen Zeile, also mit seinem aktuellen Regex bekommt er alle Arten von unerwünschten Übereinstimmungen: [DEMO] (http://regexr.com?37asm) – OGHaza

+0

Welche unerwünschten Übereinstimmungen gibt es? In den unteren Zeilen gibt es teilweise Übereinstimmungen, aber das sind gültige Zahlen. –

+0

Sehr unwahrscheinlich, dass OP Teilübereinstimmungen für Eingaben übernehmen würde, die er als nicht übereinstimmend aufgelistet hat. Das ist so, als ob ich dich nach den positiven Zahlen in der Liste '1 -2 -3' frage und du '1", "2" und "3" zurückschickst. Sicher, das sind positive Zahlen, die in der Liste vorkommen, aber sie wurden aus irgendeinem nützlichen Kontext herausgenommen. – OGHaza

Verwandte Themen