c# Strings Splitten c# Strings Splitten
Ergebnis 1 bis 18 von 18
  1. 27.11.2012, 00:02
    #1
    Hallo Community, ich versuche gerade eine kleine App zu schreiben die mir die Molmassen einens Moleküls berechnet. Einfach um ein wenig Erfahrung in C# zu gewinnen. Nun stehe ich vor der Problematik dass ich nicht weiter weiß. Z.B bei der Eingabe von NaCl.
    Code:
    [FONT=Consolas][FONT=Consolas][FONT=Consolas]string[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas] str = myTexteingabe.Text;[/FONT][/FONT]
    [FONT=Consolas][FONT=Consolas]
    [/FONT][/FONT][FONT=Consolas][FONT=Consolas][/FONT][/FONT][FONT=Consolas][FONT=Consolas][FONT=Consolas]char[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas][] split = { [/FONT][/FONT][FONT=Consolas][FONT=Consolas][FONT=Consolas]' '[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas], [/FONT][/FONT][FONT=Consolas][FONT=Consolas][FONT=Consolas]'+'[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas] };[/FONT][/FONT]
    [FONT=Consolas][FONT=Consolas]
    [/FONT][/FONT][FONT=Consolas][FONT=Consolas][/FONT][/FONT][FONT=Consolas][FONT=Consolas][FONT=Consolas]string[/FONT][/FONT][/FONT][FONT=Consolas][FONT=Consolas][] splitted = str.Split(split);[/FONT][/FONT]
    Diesen Code habe ich jetzt geschrieben um Z.B. NaCl + HCl später separat weiter verarbeiten zu können. Z.B die Molekülmasse zu berechnen. Im Grunde möchte ich nun, NaCl in Na und Cl trennen. Aber wie kann ich jetzt splitted [0] so trennen, dass, wenn auf ein Großbuchstabe ein kleiner Folgt diese zusammen gehören und Großbuchstaben auch separat gespeichert werden. Wäre dankbar für eure Hilfe
    0
     

  2. Hmm, am besten vilelleicht über reguläre Ausdrücke:
    Code:
    Regex r = new Regex("(?:([A-Z][a-z]{0,2}))+"); //suche nach Grossbuchstabe gefolgt von mindestens null, maximal zwei Kleinbuchstaben. Wiederhohle dies so oft es geht, packe jeden Treffer in einen eigenen Match.
    	allMatchResults = r.Matches(subjectString);
    	if (allMatchResults.Count > 0) {
    		//allMatchResults.Item[0]; //ist der erste Treffer.
                     //allMatchResults.Item[1]; //entsprechend der zweite.
    oder du machst einfach zwei dropdowns und listest alle Elemente auf. nur mit dem regex kannst du praktischerweise auch komplexere Moleküle aufspliten lassen, da er alles erkennt, solange Grossbuchstaben korrekt verwendet werden
    1
     

  3. 27.11.2012, 09:17
    #3
    Also wenn du "NaCl + HCl" mit deinem Code aufsplittest, dann hast du nachher "NaCl " + " HCl" in deinen gesplitteten Strings stehen. Da solltest du auf jeden Fall noch Trim drauf aufrufen, damit die Leerzeichen wegkommen.

    Ansonsten sollte das mit der Regex passen - die Dinger sind zwar quasi unlesbar aber unglaublich praktisch. Alternativ könnte man selbst einen Parser schreiben - mehr Aufwand, dafür aber im nachhinein eher wartbar.
    1
     

  4. Nee whitespace wird nicht gematcht
    Mit der kostenlosen PocketPC.ch App von meinem LG-E900 aus geschrieben.
    0
     

  5. 27.11.2012, 15:29
    #5
    Danke euch für die schnelle Antwort.
    Werde es gleich mal mit Regex ausprobieren. Wie ist es mit dem eigenen Parser gemeint?
    Und ich dachte, wenn ich den String NaCl + HCL mit ' ' und '+' trenne hat splitted[0] = "NaCl" und splitted[1] = "HCL". oder sehe ich das jetzt Falsch?
    0
     

  6. 27.11.2012, 16:48
    #6
    Nach dem Trim hast du die Leerzeichen da noch mit drinnen - scheinbar filtert das aber dann die Regex raus so wie sie da oben definiert ist.
    0
     

  7. 27.11.2012, 23:29
    #7
    Code:
    Regex r = new Regex("(?:([A-Z][a-z]{0,2}))+"); //suche nach Grossbuchstabe gefolgt von mindestens null, maximal zwei Kleinbuchstaben. Wiederhohle dies so oft es geht, packe jeden Treffer in einen eigenen Match.
    
               MatchCollection allMatchResults = r.Matches(myTexteingabe.Text);
               bool bedingungWahr = r.IsMatch(myTexteingabe.Text);
    
               myTextausgabe.Text = bedingungWahr.ToString();
    
               
    
               if (allMatchResults.Count > 0)
               {
                   //allMatchResults.Item[0]; //ist der erste Treffer.
                   //allMatchResults.Item[1]; //entsprechend der zweite.
    
               }
    Momentan habe ich es soweit geschafft. Aber, wie gebe ich meine allMatchResults richtig in myTextausgabe1.Text aus?
    Und woher kommt das .Item[]?

    Und natürlich würde ich mich über Hinweise auf Fehlern und Verbesserungen in dem Code freuen.

    Ich freue mich, dass ihr so hilfsbereit meine Fragen beantwortet, danke
    0
     

  8. also den bedingungWahr brauchst du m.E. gar nicht, da du bei allMatchResults.Count nur grösser Null bekommst, wenn wirklich was gefunden wurde, ist ja klar.
    im moment solltest du da in myTextausgabe.Text stehen haben "true" oder "wahr". weiss gerade nicht, wie die Lokalisation da greift.
    jedenfalls wolltest du ja die Molmasse berechnen. also hast du nun in einer Klasse alle Elemente des Moleküls.
    über .Item[0] kannst du auf einzelne Elemente der Klasse MatchCollection zugreifen.
    allMatchResults ist etwas komplexer als als ein Array, aber auch kein Hexenwerk. ein ZAG reicht
    guckstdu doku: http://msdn.microsoft.com/de-de/libr...ollection.aspx
    1
     

  9. 28.11.2012, 22:37
    #9
    die Zeile mit bool habe ich nur zum ausprobieren genutzt, ob überhaupt das was ich geschrieben hat etwas ausgibt. da ich nicht weiß wie ich den ersten Wert korrekt ausgebe. Habe noch nie mit regex gearbeitet. Aber ich komme nicht drauf wie ich einfach die .item[0] ausgebe. z.B myTextausgabe.Text = allMatchResults.item[0]; funktioniert nicht.
    Wie genau funktioniert das?
    Ich komme da nicht hinter und leider hilft mir der Link auch nicht viel weiter.

    Vielleicht könntest mir da jemand ein konkretes Beispiel geben. Dann könnte ich mir den Rest davon Ableiten. Bzw. selbst erarbeiten.

    danke im Vorraus
    0
     

  10. also, du hast einen Regulären Ausdruck, das ist eine Art, um, zu definieren, was gesucht wird, ersetzt wird, etc. die notation ist von system und sprache abhängig, aber wiki erklärt es ganz gut: http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck
    dann hast du die Klasse MatchCollection. Damit machen wir eine neue Instanz, theoretischginge das auch mit MatchCollection new = allMatchResults, ist aber c# schnell genug für, kann man sich schenken
    Wie dem auch sei, die MatchCollection ist im prinzip mal nicht viel mehr als ein Array. Aber du musst dich halt nicht um den Typ kümmern etc.

    dann benutzt du die Methode (weil Funktionen von Klassen heissen Methoden) Matches des Regulären Ausdrucks r. den haben wir ja sauber initatilisiert weil gleich auch mit Inhalt befüllt.
    Diese Methode nimmt nun den Ausdruck und matcht den mit dem übergebenen String (bzw. dem Zeiger darauf). Dabei liefert er treffer und das mehrfach, welche eben die Klasse MatchCollection aufnimmt.
    und um ein Array zu adressieren nimmst du ja [indexnummer]. genau so auch bei der Eigenschaft .Item von MatchCollection.
    und wenn du nun das auswerfen willst, machst du z.b.
    Code:
    if (allMatchResults.Count > 0)
    {
       integer i=0;
       for (allMatchResults.Count)
       {
            myTextausgabe.Text+=allMatchResults.Item[i].ToString()+" und ";
       }
       i++;
    }
    oder arbeitest mit foreach oder was dir am besten gefällt.
    0
     

  11. 29.11.2012, 12:19
    #11
    Ja danke für deine Hilfe. Aber was ich schon ausprobiert habe, um überhaupt erstmal eine Ausgabe zu sehen, war myTextausgabe.Text = allMatchResults.Item[0].ToString(); aber da hat mir der Compiler (MS Visual Studio 2012 Pro) das .Item blau unterstrichen. Wenn ich heute Nachmittag wieder zu Hause bin werde ich deine Vorschlag mal Ausprobieren und werde berichten.
    Mit der kostenlosen PocketPC.ch App von meinem RM-821_eu_euro2_248 aus geschrieben.
    0
     

  12. 29.11.2012, 17:30
    #12
    Diese Fehlermedldung kommt und das .Item[i] wird balu unterstrichen.

    Fehler 1 'System.Text.RegularExpressions.MatchCollection' enthält keine Definition für 'Item', und es konnte keine Erweiterungsmethode 'Item' gefunden werden, die ein erstes Argument vom Typ 'System.Text.RegularExpressions.MatchCollection' akzeptiert (Fehlt eine Using-Direktive oder ein Assemblyverweis?). C:\Users\Agredo\Documents\Visual Studio 2012\Projects\App\App\Molrechner.xaml.cs 54 58 App

    Wie muss ich item definieren?
    0
     

  13. Using System.Text.RegularExpressions;
    Mit der kostenlosen PocketPC.ch App von meinem LG-E900 aus geschrieben.
    0
     

  14. 29.11.2012, 20:37
    #14
    Habe ich bereits eingebunden. Wäre ja zu schön gewesen wenn es so einfach wäre
    0
     

  15. kurios. ist auf jeden Fall auf WP verfügbar: http://msdn.microsoft.com/en-us/libr...=vs.95%29.aspx und ich benutz das ja auch so. sorry, steh grad auf der Leitung, denk morgen drüber nach
    1
     

  16. 30.11.2012, 06:21
    #16
    ich habe den Fehler gefunden...
    Code:
    if (allMatchResults.Count > 0)
    
    
                   for (int i = 0; i < allMatchResults.Count; i++)
                   {
    
                       myTextausgabe2.Text += allMatchResults[i].ToString();
    
    
                   }
    Jetzt Habe ich nur das Problem, dass wenn ich NaCl eingebe NaCl, in allMatchResults[0] NaCl ausgegeben bekomme und nicht Na und Cl.

    Aber danke für deine Hilfe dein Link hat dann doch noch sehr geholfen nachdem ich da auf den Hyperlink von Intem gegangen bin
    1
     

  17. cool.
    ja, natürlich bekommst du das. du machst:
    Code:
    myTextausgabe2.Text += allMatchResults[0].ToString(); //=Na
    myTextausgabe2.Text += allMatchResults[1].ToString(); //=Cl
    mach doch:
    Code:
    myTextausgabe2.Text += allMatchResults[i].ToString()+" ";
    um ein Leerzeichen einzufügen nach jedem Element?
    0
     

  18. 30.11.2012, 17:30
    #18
    Ich muss mich echt bedanken, dass du so viel Geduld mit mir hast.

    Also ich habe dein Vorschlag ausprobiert und musste feststellen, dass es nicht klappt. Darauf hin habe ich mich mir das Pattern angeguckt. Also new Regex("(?[A-Z][a-z]{0,2}))+"); und da ist mir das "+" am ende aufgefallen. Wenn ich das rauslasse trennt der Compiler bei der Ausgabe Na und Cl. Ist das jetzt soweit richtig gedacht von mir, oder komm ich jetzt nur zufällig auf das richtige Ergebnis?

    ---------- Hinzugefügt um 18:30 ---------- Vorheriger Beitrag war um 17:16 ----------

    Kann mir vielleicht noch jemand sagen wie ich allMatchResults[i] in einem string Array z.B strArray [i] speicher?


    Code:
    string str = allMatchResults[0].ToString(); // Klappt
    und nach recherche habe ich diesen Code gefunden. Aber nach der Ausgabe von Atom[0] bleibt das Textfeld leer.
    Code:
    string[] Atom = new string[allMatchResults.Count];
                for (int i = 0; i > allMatchResults.Count; i++)
                {
                    Atom[i] = allMatchResults[i].Groups[0].Value;
    
                }
    Wäre nett wenn jemand eine Idee hätte um mir zu helfen
    0
     

Ähnliche Themen

  1. Hilfe beim splitten von Strings.
    Von Agredo im Forum Windows Phone 7 Entwicklung
    Antworten: 6
    Letzter Beitrag: 12.09.2012, 12:15
  2. Antworten: 1
    Letzter Beitrag: 05.10.2009, 15:08

Besucher haben diese Seite mit folgenden Suchbegriffen gefunden:

c# in strings mehrfach splitten

eingabe splitten und ausgeben c#

strings splitten c# hilfe

c# string spliten

c# String separieren mit Regex

notiz app windows phone c#

c# eingabe splitten

Stichworte