Die Dezimal/Gleitzahl Extraktion Regex kann je nachdem, ob und was tausend Trennzeichen verwendet werden, welches Symbol bezeichnet ein Dezimaltrennzeichen, ob man auch einen Exponenten übereinstimmen soll, ob ein positives oder negatives übereinstimmen Zeichen, ob Zahlen übereinstimmen, die führende 0
haben können, oder nicht, unabhängig davon, ob eine Zahl extrahiert wird, die mit einem Dezimaltrennzeichen endet.
A generic regex die häufigsten Dezimalzahl Typen entsprechen in Matching Floating Point Numbers with a Regular Expression vorgesehen ist:
[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?
Ich änderte nur die Erfassungsgruppe zu einer Nicht-Erfassung ein (?:
nach (
hinzugefügt).It matches
Wenn Sie es noch mehr Generika, vornehmen müssen, wenn das Dezimaltrennzeichen entweder ein Punkt oder ein Komma sein kann, ersetzen \.
mit einer Zeichenklasse (oder einem Ausdruck in eckigen Klammern) [.,]
:
[-+]?[0-9]*[.,]?[0-9]+(?:[eE][-+]?[0-9]+)?
^^^^
Hinweis die obigen Ausdrücke entsprechen sowohl Integer als auch Gleitkommazahlen. Um nur Schwimmer/Dezimalzahlen zu entsprechen sicherstellen, dass das gebrochene Musterteil des zweiten ?
nach \.
(demo) durch Entfernen obligatorisch ist:
[-+]?[0-9]*\.[0-9]+(?:[eE][-+]?[0-9]+)?
^
Nun wird 34
nicht abgestimmt: abgestimmt ist.
Wenn Sie nicht float Zahlen übereinstimmen möchten, ohne führende Nullen (wie .5
) machen die erste Ziffer Anpassungsmuster obligatorisch (von +
quantifier Hinzufügen übereinstimmen 1 oder mehrere Vorkommen von Stellen):
[-+]?[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)?
^
Siehe this demo. Nun, es passt viel weniger Proben:
Nun, was ist, wenn Sie nicht wollen, <digits>.<digits>
innerhalb <digits>.<digits>.<digits>.<digits>
passen? Wie passt man sie an? als ganze Wörter? Verwenden Sie lookarounds:
[-+]?(?<!\d\.)\b[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)?\b(?!\.\d)
Und ein demo here:
Nun, was ist mit den Schwimmern, die Tausendertrennzeichen haben, wie 12 123 456.23
oder 34,345,767.678
? Sie können (?:[,\s][0-9]+)*
nach dem ersten [0-9]+
hinzufügen mit 1+ Ziffern gefolgt Null oder mehrere Sequenzen von einem Komma oder Leerzeichen übereinstimmen:
[-+]?(?<![0-9]\.)\b[0-9]+(?:[,\s][0-9]+)*\.[0-9]+(?:[eE][-+]?[0-9]+)?\b(?!\.[0-9])
Siehe die regex demo:
Swap ein Komma mit \.
Wenn Sie ein Komma als Dezimaltrennzeichen und einen Punkt als Tausendertrennzeichen verwenden müssen.
Nun, wie Sie diese Muster in C# verwenden?
var results = Regex.Matches(input, @"<PATTERN_HERE>")
.Cast<Match>()
.Select(m => m.Value)
.ToList();
Ich mag, wie er das sehr genaue Beispiel http://dotnetperls.com/regex-split – Wildhorn
@Wildhorn verwendet - Was ist daran falsch? Er hat es wahrscheinlich bei der Suche nach einer Antwort auf sein Problem entdeckt und bemerkt, dass es nahe war, aber nicht nahe genug. –