Regex eine Dezimalzahl mit Komma
Bin ich wogenden Probleme bei der Suche nach den richtigen regex für dezimal-zahlen, die zählen die Komma-Trennzeichen.
Ich habe ein paar andere Fragen zu diesem Problem im Allgemeinen, aber keine der Antworten wirklich funktionierte, wenn ich diese getestet
Die besten, die ich habe, so weit ist:
[0-9]{1,3}(,([0-9]{3}))*(.[0-9]+)?
2 Haupt-Probleme bisher:
1) zeichnet Es die zahlen mit Leerzeichen zwischen Ihnen "3001 1" stattdessen splitten auf 2 Spiele "3001" "1" - sehe ich nicht wirklich wo ich erlaubt Leerzeichen in der regex.
2) ich habe ein generelles problem mit dem Anfang\Ende des regex.
Regex übereinstimmen sollten:
3,001
1
32,012,111.2131
Aber nicht:
32,012,11.2131
1132,012,111.2131
32,0112,111.2131
32131
Außerdem würde ich gerne es entsprechen:
1.(without any number after it)
1,(without any number after it)
as 1
(ein Komma oder ein Punkt am Ende der Nummer sollte übersehen werden).
Vielen Dank!
.
Sie erlaubt Leerzeichen in der regex mit der Zeit (
.
), das entspricht einem beliebigen Zeichen. Die Flucht der Zeit (\.
) nur match der Zeit ist nur.Ich glaube nicht, dass die zweite und Dritte Probleme sind Probleme. Was ich sagen kann, dass Sie nicht mit dem übereinstimmen, was Sie nicht soll.
OP müssen wir wissen, welche regex-engine, die Sie verwenden... nur kann ich dies absolut die Arbeit, die für alle Fälle (einschließlich der zahlen, getrennt durch nur ein Leerzeichen), wenn beide lookbehinds und lookaheads sind verfügbar.
Ich bin mit regex in c#.
InformationsquelleAutor LiranBo | 2013-11-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine sehr lange und komplizierte reguläre Ausdruck passt alle Ihre Anforderungen. Es wird funktionieren, wenn dein regex-engine basiert auf PCRE (hoffentlich bist du mit der PHP -, Delphi-oder R..).
DEMO auf RegExr
Dinge, die machen es so lange:
.
und,
ohne die.
oder,
im Spiel erfordert ein anderes lookahead.(?=[,.](\s|$))
ErklärungBeim schreiben dieser Erklärung, die ich realisiert, die
\s
muss(\s|$)
passend1,
am Ende einer Zeichenkette.Diesem Teil der regex ist für den Abgleich der
1
im1,
oder die1,000
im1,000.
so nehmen wir an, unsere Nummer ist1,000.
(mit der.
auf das Ende).Bis zu diesem Punkt der regex angepasst
1,000
, dann kann es keine andere,
zu wiederholen, die Tausende Gruppe, so bewegt es sich auf unserer(?=[,.](\s|$))
(?=....)
bedeutet, dass Ihr einen lookahead, das heißt, von wo wir aufeinander zu, schauen, was kommt, aber nicht fügen Sie es zu dem match.Also Es wird überprüft ob es eine
,
oder eine.
und wenn es heißt, es prüft, es ist sofort gefolgt von Leerzeichen oder das Ende der Eingabe. In diesem Fall ist es, so würd es lassen, das match1,000
Hatte die lookahead nicht abgestimmt, hätte es zog auf, der versucht, dezimal stellen.
Ah Super, werde ich hinzufügen, dass die Erklärung für die Antwort.
Antwort aktualisiert - ich hatte, um eine leichte Veränderung der regex zu erlauben, für ein edge-case.
yo, wenn diese arbeiten noch große bitte akzeptieren Sie die Antwort.
getan. vielen Dank!
InformationsquelleAutor OGHaza
Dies funktioniert für alle diejenigen, die Sie aufgeführt haben
InformationsquelleAutor Adarsh
.
bedeutet "irgend ein Zeichen". Die Verwendung einer literalen.
-, Flucht es so:\.
.Soweit ich weiß, das ist das einzige, was fehlt.
Was unerwünschte Spiele gibt es? Es gibt teilweise übereinstimmungen in den unteren Zeilen, aber diese sind gültige zahlen.
Sehr unwahrscheinlich, dass die OP würde zu nehmen, teilweise übereinstimmungen für Eingänge er hat sich aufgeführt, als nicht-matching. Das ist wie mich zu Fragen, Ihnen für die positiven zahlen in der Liste
1 -2 -3
und Sie Rückgabe"1", "2" and "3"
. Sicher, das sind positive zahlen, die auftreten, in der Liste, aber Sie waren aus irgendeinem sinnvollen Kontext.In diesem Fall sollte er angeben, was gültig ist. Zum Beispiel ist
1,2,3,4
eine Liste von durch Komma getrennten zahlen, oder ist es eine ungültige Nummer???Thx für den Hinweis, der Unterschied zwischen . zu \.
InformationsquelleAutor Kendall Frey