2010-08-26 4 views
5
string sentence = "X10 cats, Y20 dogs, 40 fish and 1 programmer."; 

string[] digits = Regex.Split (sentence, @"\D+"); 

für diesen Code i Werte in Ziffern Array erhalten wie diese 10,20,40,1wie tut Dezimalzahl von Zeichenfolge in C# extrahieren

string sentence = "X10.4 cats, Y20.5 dogs, 40 fish and 1 programmer."; 

string[] digits = Regex.Split (sentence, @"\D+"); 

für diesen Code i Werte in Ziffern Array erhalten wie Diese 10,4,20,5,40,1

aber ich mag es, wie diese 10.4.20.5,40,1 in Dezimalzahlen zu bekommen, wie kann ich das tun.

+0

Ich mag, wie er das sehr genaue Beispiel http://dotnetperls.com/regex-split – Wildhorn

+5

@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. –

Antwort

20

Kleine Verbesserung @ Michael-Lösung suchen sollten:

// NOTES: about the LINQ: 
// .Where() == filters the IEnumerable (which the array is) 
//  (c=>...) is the lambda for dealing with each element of the array 
//  where c is an array element. 
// .Trim() == trims all blank spaces at the start and end of the string 
var doubleArray = Regex.Split(sentence, @"[^0-9\.]+") 
    .Where(c => c != "." && c.Trim() != ""); 

Returns:

10.4 
20.5 
40 
1 

Die ursprüngliche Lösung wurde zurückgegeben

[empty line here] 
10.4 
20.5 
40 
1 
. 
+2

. Wo (w =>! String.IsNullOrEmpty (w)) ist eleganter. (> = .net 4) – Alexandre

+0

Dies funktioniert nicht mit negativen Werten. –

+0

@ kami: Das liegt daran, dass der Regex-Ausdruck nur nach positiven Zahlen gesucht hat. Sie müssten die Regex für Ihre Situation ändern. Allerdings war meine Antwort speziell (vor 7 Jahren) darauf gerichtet, das OP zu lösen, und nicht für alle Situationen gedacht. – code4life

0

Wenn Sie Linq:

stringArray.Select(s=>decimal.Parse(s)); 

A foreach würde auch funktionieren. Sie müssen möglicherweise überprüfen, dass jede string ist eigentlich eine Zahl (.Parse nicht werfen Ausnahme).

+0

wie bekomme ich s Wert – ratty

+0

s ist die in-Scope-Variable für die Linq-Abfrage. Es ähnelt foreach (String s in stringArray). –

5

versuchen

Regex.Split (sentence, @"[^0-9\.]+") 
+1

Dies würde Ihnen auch einen falschen positiven Wert von 10.1.1.4 geben. –

+1

Korrigiert das Caret (^) das nicht? –

+0

@Daren Thomas, \ D gleich [^ 0-9] –

1

Überprüfen Sie die Syntax lexers für die meisten Programmiersprachen für einen regulären Ausdruck für Dezimalstellen. Ordne diese Regex der Zeichenfolge zu und finde alle Übereinstimmungen.

0

Sie müssen Dezimalstellen in Ihrem regulären Ausdruck berücksichtigen. Versuchen Sie Folgendes:

\d+(\.\d+)? 

Dies die Zahlen übereinstimmen, anstatt alles andere als die Zahlen, aber es sollte einfach sein, durch die Spiele zu wiederholen Ihr Array zu bauen.

Etwas im Auge zu behalten ist, ob Sie auch für negative Vorzeichen, Komma usw.

4

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 matchesenter image description here

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: enter image description here 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: enter image description here

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:

enter image description 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:

enter image description here

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(); 
+0

Vielen Dank für Ihre Antwort. Dies würde für Strings wie "1.000.000.20" oder "1.000.000.20" nicht funktionieren. – joanfihu

+0

@joanfihu Es funktioniert für '1.000.000.20', aber sicher nicht für' 1.000.000,20' (https://regex101.com/r/YFGJAe/1), da diese nicht in ein und demselben Kontext verwendet werden sollten da der zweite nicht dem US-Nummernformat folgt. Sie müssen den Ausdruck manuell ändern, um Punkte als Zifferngruppierungssymbole und Kommas als Dezimaltrennzeichen zu verwenden. –

+0

Danke. Das erste Beispiel funktioniert mit der letzten Regex. Ich habe die verwendet, die mit Kommas und Punkten arbeitet. Was würden Sie verwenden, um die Zahlenformatierung zu erkennen? Ich brauche es für die Formatierung in den USA und Großbritannien und den Rest der Welt. – joanfihu

Verwandte Themen