String zerlegen



  • Sorry das fiel mir erst auf nach dem ich dieses Beispiel geproggt habe!



  • Wie gesagt jetzt hast dualle Matches (Treffer) einzeln! Ich hoffe das isses und hilft Dir weiter!

    happy working today 🙂 👍

    mfg sclearscreen



  • Probiers mal in deiner IDE aus bei mir funzt es dodal gut



  • hi, danke schaut gut aus;-)
    ich habe:

    String nummern = @"06769213456; 065012345";
    

    beim ersten m.Value ist noch ; dabei...soll ich das manuell wegschneiden? die die 0 muss auch noch weg damit ich habe:
    6769213456 und 65012345

    bye



  • um in einen Einzelnen Match die Voranstehende 0 wegzukriegen brauchst du jetzt aber keine Regex - Objects mehr es is ja nur noch nen einzelner String!
    Da haste Dann wieder die einzeln String.Methoden.
    Da wären sonst Regex die brühmten Kanonen auf Spatzen.

    Gehören eigentlich die DataGrid-, ADO .NET- Postings zu Dir
    nur halt aus Interesse diese Frage?
    😉



  • Prüf halt am Index 0 des Strings auf Zeichen '0' und bau den String dann
    erst ab Index 1 auf



  • Dann kannste noch beim Letzen Index des Strings auf das '; prüfen und lässt Du dann auch weg!

    Ja mach das manuell, nur um Deine Frage zu beantworten



  • hi, jo verwende Dataset und Datagrid auch...

    hm warum workt das nicht so:

    matchCollection[0].ToString().Remove(0, matchCollection[0].Length);
    foreach (Match m in matchCollection) 
    {
       MessageBox.Show(m.Value); 
    }
    


  • so sollt es aussehen, work aber nicht:

    matchCollection[0].ToString().Remove(matchCollection[0].Length - 1, 1);
    

    cu



  • Vorab die Methode Remove gehört zur String - Klasse!
    Also in der MSDN steht zu Remove:
    löscht die Anzahl der Zeichen ab einem bestimmten StartIndex

    Remove(StartindexabdemGelöschtWird, ANzahlderZulöschendenZeichen);
    

    Wenn Du das 1. Zeichen löschen willst sieht das so aus!

    String nummer "066666667";
    nummer = nummer.Remove(0,1);
    

    in deinem Code - Posting etwa so geändert

    String nummerOhneNull;
    			foreach (Match m in matchCollection)
    			{
    				nummerOhneNull = m.Value.Remove(0,1);
    				Console.WriteLine(nummerOhneNull);
    			}
    


  • Die Strings im MatchCollection sind glaube ich const und wie du löschen wolltest hättest Du wenns geklappt hätte die Komplette Telefonnummer gelöscht!!!



  • Zieh den einzelnen Match in nen String - Objekt und manipuliere dann!
    Dann gehts auch probier doch mein Beispiel bei Dir aus dann wirst du es sehn,
    das es so funzt.



  • String nummerOhneNullundSemikolon;
    			foreach (Match m in matchCollection)
    			{
    				nummerOhneNullundSemikolon = m.Value;
    				if(nummerOhneNullundSemikolon.StartsWith("0"))
    					nummerOhneNullundSemikolon = nummerOhneNullundSemikolon.Remove(0,1);
    
    				if(nummerOhneNullundSemikolon.EndsWith(";"))
    					nummerOhneNullundSemikolon = nummerOhneNullundSemikolon.Remove((nummerOhneNullundSemikolon.Length - 1), 1);
    
    				Console.WriteLine(nummerOhneNullundSemikolon);
    			}
    


  • using System;
    using System.Collections;
    using System.Collections.Specialized;
    using System.Text.RegularExpressions;
    
    namespace StringZerlegen
    {
    	/// <summary>
    	/// Zusammenfassung für Class1.
    	/// </summary>
    	class Class1
    	{
    		/// <summary>
    		/// Der Haupteinstiegspunkt für die Anwendung.
    		/// </summary>
    		[STAThread]
    		static void Main(string[] args)
    		{
    			//
    			// TODO: Fügen Sie hier Code hinzu, um die Anwendung zu starten
    			//
    			String nummern = @"065012345;06761234567;066422222222";
    			MatchCollection matchCollection;
    			Regex regex = new Regex(@"[(0664),(0676),(0699),(0650),(0660),(0688)][ 0-9]+;?"); // findet Telefonnummern Semikolon lässt sich dann mit den normalen Methoden des Stringobjektes rausseparieren
    			matchCollection = regex.Matches(nummern);
    			foreach (Match m in matchCollection)
    				Console.WriteLine(m.Value);
    
    			Console.WriteLine();
    
    			// Abschneiden von führender 0 und letzten Semikolon
    			String nummerOhneNull;
    			foreach (Match m in matchCollection)
    			{
    				nummerOhneNull = m.Value;
    				if(nummerOhneNull.StartsWith("0"))
    					nummerOhneNull = nummerOhneNull.Remove(0,1);
    
    				if(nummerOhneNull.EndsWith(";"))
    					nummerOhneNull = nummerOhneNull.Remove((nummerOhneNull.Length - 1), 1);
    
    				Console.WriteLine(nummerOhneNull);
    			}
    		}
    	}
    }
    

    gucks mal an



  • So ich nehme jetzt ne Mütze voll Schlaf, muß morgen zu meiner EDVtechnischen Weiterbildung die zieht sich über den ganzen Tag.

    Dein Problem sollte jetzt gelöst sein, hoffe ich!

    also denn machs gut, ich bin schon ganz müde 🙄 das Bett ruft.

    mfg sclearscreen 🙂



  • hi,

    ich habs so probiert:

    ArrayList Numbers = new ArrayList();
    int count = 0;
    MatchCollection matchCollection; 
    Regex regex = new Regex(@"[(0664),(0676),(0699),(0650),(0660),(0688)][ 0-9]+;?"); // findet Telefonnummern Semikolon lässt sich dann mit den normalen Methoden des Stringobjektes rausseparieren 
    matchCollection = regex.Matches(textBox_Receivers.Text);
    
    foreach (Match m in matchCollection) 
    {
    	Numbers.Add(m.Value.Remove(0,1)); // erste Zeichen wegschneiden
    	// Wenn Numbers[count] an letzten pos ein ';' hat dann
    	{
    		// letztes zeichen wegschneiden
    	}
    
    	MessageBox.Show(Numbers[count++].ToString());
    }
    

    kann man in einer foreach schleife irgendwie an den aktuellen index kommen, ich hab eine variable count verwendet geht das auch schöner?
    und ich weiss nicht genau wie ich das ';' weg bekomme;-)
    cu



  • ok funzt nun prima;-) danke wieder was gelernt;-)
    nur möcht noch wissen ob ich in einer foreach schleife auch irgendwie auf den index komme? ich hab ja hier nun eine count var...
    aber sonst müsste der code habswegs schön sein?;-)

    ArrayList Numbers = new ArrayList();
    int count = 0;
    MatchCollection matchCollection; 
    Regex regex = new Regex(@"[(0664),(0676),(0699),(0650),(0660),(0688)][ 0-9]+;?"); // findet Telefonnummern Semikolon lässt sich dann mit den normalen Methoden des Stringobjektes rausseparieren 
    matchCollection = regex.Matches(textBox_Receivers.Text);
    
    foreach (Match m in matchCollection) 
    {
    	Numbers.Add(m.Value);
    
    	if(Numbers[count].ToString().StartsWith("0"))
    	{
    		Numbers[count] = Numbers[count].ToString().Remove(0,1); 
    	}
    
    	if(Numbers[count].ToString().EndsWith(";"))
    	{
    		Numbers[count] = Numbers[count].ToString().Remove((Numbers[count].ToString().Length - 1), 1);
    	}
    
    	MessageBox.Show(Numbers[count++].ToString());
    }
    

    bye 😃



  • hm, wie kann ich das nun mit Namen in Handynummer erstzen machen....

    so kann ich die telefonnummer eines namens suchen:

    // Loop through each column in the dataSet
    for(int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
    {
      if(dataSet.Tables[0].Rows[i].ItemArray[0].ToString() == Name) {
        return dataSet.Tables[0].Rows[i].ItemArray[1].ToString(); //Telnr zurückgeb
      }
    }
    

    also ich hab ja dann folgenden input:
    Gerald; 06501234567; Sabine
    hier soll dann Gerald und Sabine durch eine Handynummer ersetzt werden...
    und darauf hin ist das der input für die im vorigen post gebastelte regex zerlegung...

    hab mir dadacht ich nimm da so eine funktion die einen teilstring im string sucht..falls ich da was finde 😃

    bye



  • Hi bin wieder da Wegen der foreach-/ Indexgeschicht
    verstehe nicht wareum Du da noch den Index Brauchst?
    Der Sinn und Zweck einer foreach - Schleife gegenüber ner for -Schleife ist das ich keinen Index brauche und man vermeidet sozusagen eine IndexOutOfBounds - Exception sprich Indexüberlauf
    wenn Du aber denoch dein MatcheCollection - Objekt mit ner for - schleife durchlaufen willst hast du die IndexGrenze durch den MatchCollection.Count - Member

    Guck Dir mal die grundlegenden Code - Samples zu ner For/ Foreach - Schleife an! Das ist lediglich nen Design - Frage vom Code her gesehen.
    Foreach - Konstrukt hilft den Programmlogik - Fehler zu vermeiden, vorausgesetzt man hat Vorausgedacht und die richtigen Datentypen verwendet.
    Aber nen Collection - Datentyp habe ich ja mit weisser Voraussicht in meinem Beispiel verwendet!

    Wenn du unnnnnnnbedingt nen Index brauchst zähl doch in der foreach - Schleife einfach mit Wenn die Wertemenge sprich Collection nicht leer ist werde doch auch Runden in der Schleife gedreht! kling doch logisch jedenfalls fuer mich.:
    Guckst du und machst du so

    String nummerOhneNull;
    int MatchIndexCount = 0;
    			foreach (Match m in matchCollection)
    			{
                            MatchIndexCount++; // Das is dein Index der sogar gezählt wird
    				nummerOhneNull = m.Value;
    				if(nummerOhneNull.StartsWith("0"))
    					nummerOhneNull = nummerOhneNull.Remove(0,1);
    
    				if(nummerOhneNull.EndsWith(";"))
    					nummerOhneNull = nummerOhneNull.Remove((nummerOhneNull.Length - 1), 1);
    
    				Console.WriteLine(nummerOhneNull);
    			}
    


  • geri schrieb:

    hm, wie kann ich das nun mit Namen in Handynummer erstzen machen....

    so kann ich die telefonnummer eines namens suchen:

    // Loop through each column in the dataSet
    for(int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
    {
      if(dataSet.Tables[0].Rows[i].ItemArray[0].ToString() == Name) {
        return dataSet.Tables[0].Rows[i].ItemArray[1].ToString(); //Telnr zurückgeb
      }
    }
    

    also ich hab ja dann folgenden input:
    Gerald; 06501234567; Sabine
    hier soll dann Gerald und Sabine durch eine Handynummer ersetzt werden...
    und darauf hin ist das der input für die im vorigen post gebastelte regex zerlegung...

    hab mir dadacht ich nimm da so eine funktion die einen teilstring im string sucht..falls ich da was finde 😃

    bye

    Also irgenwie muss du doch in deinem Projekt über die Datenerfassung Name und Telefonnummern in Beziehung setzen können!
    Da wie Du ja gesagt hast Die XML - Threads von gestern auch von Dir sind!
    Gehe ich davon aus das eine XML - File existiert wo Personendatensätze logisch mit Hilfe von XML - Tags aufbereitet sind! ala

    <Person>
    <PersonenName>Gerald</PersonenName>
    <Rufnummer>067688888888</Rufnummer>
    </Person>
    

    ne lösung wäre fuer solch einen Datensatz nen Regex zu basteln.
    der Person - Tag setzt hier PersonenName als auch Rufnummer
    klar und eindeutig in Beziehung das sieht man sofort ein "Regex" würde Dir jeden Datensatz rausziehn der auf sein Muster passt! Da als Ergeniss ne Teilzeichekette rauskommt kann man diese Daten in jeder Hinsicht schön manipulieren Ersetzen. Einfügen und Löschen fuer dei Nummer den Namen Rausgeben
    alles ist möglic was die Zeichenkettenverarbeitung hergibt.

    Der Vorteil von Regex: Das XML - Dokument muss nichtmal wie sagt man *grübel* wohlgeformt sein. Es findet trotzdem solche Datensätze!

    Wenn dein XML - Dokument aber wohlgeformt ist und entspricht auch den Regeln des Schema oder der DTD, sofern man noch DTD verwendet, gibts auch ne andere Möglichkeit! .NET hat Klassen für alle Belange die XML betreffen.

    XMLReader; XMLWriter etc.

    Du musst dann folgende using - Klauseln einbinden ums sowas zu verwenden

    using System.Xml;
    using System.Xml.Schema;
    using System.Xml.Serialization;
    using System.Xml.Xsl;
    using System.Xml.XPath;
    

    mfg sclearscreen 👍


Anmelden zum Antworten