Autor |
Beitrag |
passchecker
Hält's aus hier
Beiträge: 12
|
Verfasst: Sa 26.07.08 22:40
Hi,
also dieses Problem ist sehr ähnlich wie mein vorheriges jedoch eröffne ich nach Christians Hinweis ein neues Thema.
Ich habe einen string und möchte diesen nach einem Integer durchsuchen und wenn eine Zahl gefunden wird soller er zb 10 hinzuaddieren. Bin mir nicht sicher ob das möglich ist, da bis jetzt alle meine Versuche versagten -.-
Hier mein Versuch:
C#-Quelltext 1: 2: 3: 4: 5: 6:
| string a = "abc1234def321adc"; string regel = @"(\d{2,})"; Regex re = new Regex(regel); a = re.Replace(a,10+"$1)");
Console.WriteLine(a); |
Hieraus sehe ich, dass mit $1 die Zahl als string behandelt wird. Kann man das irgendwie in eine Zahl umkonvertieren? Oder gibt es eine ganz andere einfachere Möglichkeit statt Regex?
Danke schon mal
Mfg
Passchecker
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 27.07.08 11:29
Hm. So mächtig ist die Replace-Funktion eines Regex leider nicht. Aber Du kannst Deinen String mittels der Regex.Split-Funktion in ein Array aus (getrennt) Buchstabengruppen und Zahlengruppen zerlegen. Dann kannst Du zu den Zahlen jeweils was hinzuaddieren und den String wieder zusammen setzen.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
passchecker 
Hält's aus hier
Beiträge: 12
|
Verfasst: So 27.07.08 12:05
hmm gibt es nicht auch die Möglichkeit mittels der IsMatch Funktion?
C#-Quelltext 1: 2: 3: 4: 5: 6:
| string a = "abc1234def321adc"; string regel = @"(\d{2,})"; Regex re = new Regex(regel); If(re.IsMatch(a)) Convert.ToInt32(regel)+10; Console.WriteLine(a); |
Hier spuckt er mir ne Fehlermeldung bei If(re.IsMatch(a)) soll ein ; gehören 
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: So 27.07.08 12:09
Christian S. hat folgendes geschrieben: | So mächtig ist die Replace-Funktion eines Regex leider nicht. |
Die hat einiges auf dem Kasten  .
C#-Quelltext 1: 2: 3: 4:
| public string Replace( string input, MatchEvaluator evaluator ) |
@passchecker: MatchEvaluator ist ein Delegate. Sollte dir das eher wenig sagen, solltest du z.B. hier nachschauen.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 27.07.08 12:10
@passchecker
Du solltest eventuell mal überlegen, was Du da machst:
Du schaust, ob irgendwo in dem String eine Zahl dem Regex entspricht. Wenn das so ist, versucht Du den Regex in eine Zahl zu konvertieren. Zu der würdest Du dann, wenn das ginge, 10 hinzu addieren. Ohne das Ergebnis jemals zu speichern.
@Sebastian: Ah! 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
passchecker 
Hält's aus hier
Beiträge: 12
|
Verfasst: So 27.07.08 21:03
hey Khabarakh!
Danke für den Tipp.
Hab mich jetzt ein bisschen hineingelesen und auch schon das Programm so umgeschrieben dass er 10 hinzuaddiert, jedoch ist es wie bei der Regex.Replace Funktion dass er mir nur eine 10 nach der Zahl schreibt und nicht hinzuaddiert.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| string a = "abc1234def321adc"; string regel = @"(\d{1,})"; Regex re = new Regex(regel); Program c = new Program(); MatchEvaluator Addierer = new MatchEvaluator(c.Replace); string b = re.Replace(a,Addierer); Console.WriteLine("Alte Zahl: " + a + " neue Zahl: " + b);} public string Replace(Match m) { return (m.Value+10); } |
@Christian
stimmt hast Recht, war natürlich Blödsinn^^
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 27.07.08 21:12
(1) Wozu erstellst Du eine neue Instanz von Program? Es sollte reichen (wenn Du keine anonyme Methode verwenden willst), die Methode Program.Replace als static zu deklarieren, wenn Du sie von einer statischen Methode aus verwenden möchtest.
(2) Zum Addieren: String-Addition != Integer-Addition. Ich möchte Dir nahe legen, Dich nochmal mit den C#-Grundlagen zu beschäftigen, da scheint noch einiges zu fehlen. Nicht böse gemeint, aber der Unterschied zwischen String und Integer ist ja wirklich elementar. Empfehlen kann ich das "OPENBOOK VISUAL C#"
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
passchecker 
Hält's aus hier
Beiträge: 12
|
Verfasst: Do 31.07.08 22:41
hi,
ich hab mir jetzt mal des ganze durchgelesen (wirklich einiges, interessantes) aber ich komm trotzdem ned weiter -.-
Des Problem is, dass ich mit dem "MatchEvaluator" des gleiche Problem habe wie mit der normalen Regex.Replace Funktion. Und ich weiss nicht wie ich das lösen könnte.
Mein Projekt ist ein sehr umfangreiches und es fehlen beim Programm eben nur mehr kleine Feinheiten wie zb diese und ich muss das Programm am 1. Aug abgeben. Darum wärt ihr mir sehr hilfreich wenn ihr mir einfach verraten würdet wie ich das Programm umschreiben soll^^
DAnke
cu passchecker
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 31.07.08 22:51
Du hast gar nicht gesagt, was Du nach meinen Hinweisen denn geändert hast?
Was String- und Integer-Addition angeht. Lass Dir einfach mal das hier ausgeben:
C#-Quelltext 1: 2:
| Console.WriteLine("2"+"3"); Console.WriteLine(2+3); |
Ich schreibe ungern fertigen Quelltext, vor allem wenn es um Grundlagen geht, die man sich sehr einfach selber erarbeiten kann.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
passchecker 
Hält's aus hier
Beiträge: 12
|
Verfasst: Do 31.07.08 23:21
hmm.. ja das ist mir eigtl klar
aba mein problem is dass er m.Value automatisch als string behandelt und mit Convert.ToInt32 ist es auch nicht möglich..ich denke hier wäre TryParse(string s,out int result) ganz nützlich oder?
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 31.07.08 23:27
Hm. Eigentlich der richtige Ansatz
Aber wieso ist Convert.ToInt32 nicht möglich? Mal abgesehen davon, dass ich die Convert-Klasse aus OOP-Gesichtspunkten nicht leiden kann, sollte Dir ein Regex @"(\d{1,})" eine Zahl liefern, die in einen Int konvertiert werden kann.
TryParse ist sicherlich sehr gut, weil man eine Fehlerbehandlung einbauen kann, ohne Exceptions abfangen zu müssen, aber wenn Convert.ToInt32 nicht geht, wird auch TryParse vermelden, dass die Konvertierung fehlgeschlagen ist.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
passchecker 
Hält's aus hier
Beiträge: 12
|
Verfasst: Do 31.07.08 23:55
ahh hilfe
ich bin schon am verzweifeln^^
gibt es jetzt eigtl zu meinem problem eine lösung, oder weißt du auch nicht weiter 
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 01.08.08 00:01
Du hast seit Sonntag keine neuen Informationen geliefert, mit denen man arbeiten kann. Wie soll ich Dir neue Hinweise geben?
Wie sieht Dein aktueller Quelltext aus? Welche Fehler treten konkret auf (C# zeigt Dir doch sogar die Zeile, in der ein Fehler auftritt!)?
Wie soll man Dir helfen, wenn man Dir alles aus der Nase ziehen muss?
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
passchecker 
Hält's aus hier
Beiträge: 12
|
Verfasst: Fr 01.08.08 00:12
ok, hast recht.. bin nur schon ein bisschen nervös..
also hier is mein aktueller code:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| string a = "abc1234def321adc"; string regel = @"(\d{1,})"; Regex re = new Regex(regel); MatchEvaluator Addierer = delegate (Match m) { return m.Value + 10; }; MatchEvaluator Elevator = new MatchEvaluator(Addierer); string b = re.Replace(a,Elevator); Console.WriteLine("Alte Zahl: " + a + " neue Zahl: " + b); |
hier fügt er mir jetzt eben die zahl 10 nach m.Value ein.. ich möchte jedoch dass er sie hinzuaddiert.. habe schon einige sachen (wie zb Convert.ToInt32) probiert.. erfolglos
Danke!
PS: Wegen der langen Unterbrechung: war bis heute um 20.00 auf Urlaub 
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 01.08.08 00:20
Du hast immer noch nicht die Fehlermeldung bei Convter.ToInt32 genannt
Ich habe es lokal ausprobiert und denke, dass ich weiß, wo der Fehler kommt. Daher nochmal eine Erklärung:
Du willst eine Integer-Addition haben. Dazu musst Du m.Value in einen Integer konvertieren. Das scheinst Du ja richtig gesehen zu haben!
MatchEvaluator erwartet als Ergebnis aber einen String. Du musst das Ergebnis der Addition (was ja dann ein Integer ist) wieder in einen String konvertieren: Stichwort ToString().
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
passchecker 
Hält's aus hier
Beiträge: 12
|
Verfasst: Fr 01.08.08 00:27
aba dann kommt bei mir folgende Fehlermeldung:
Error 1 Anonymous method of type 'System.Text.RegularExpressions.MatchEvaluator': not all code paths return a value C:\Dokumente und Einstellungen\Tobi\Desktop\Test\Program.cs 29 39 Test
daraus verstehe ich: nicht alle gefunden code teile geben einen wert aus.. aba der regex sucht doch nur zahlen...
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 01.08.08 00:29
Quelltext?
Wenn Du nur eine Zeile mit "return" vorne dran hast, dann gibt's auch immer ein Ergebnis. Folglich hast Du einen Quelltext, der mehr als diese eine zeile beinhaltet.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
passchecker 
Hält's aus hier
Beiträge: 12
|
Verfasst: Fr 01.08.08 00:32
ahh danke gelöst !
hab des return davor vergessen also mein code sieht jetzt so aus:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| string a = "abc1234def321adc"; string regel = @"(\d{1,})"; Regex re = new Regex(regel); MatchEvaluator Addierer = delegate (Match m) { return (Convert.ToInt32(m.Value)+10).ToString(); }; MatchEvaluator Elevator = new MatchEvaluator(Addierer); string b = re.Replace(a,Elevator); Console.WriteLine("Alte Zahl: " + a + " neue Zahl: " + b); |
Endlich fertig mit meinem Programm
Vielen Dank Christan für deine Hilfe und vor allem deine Geduld ! 
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 01.08.08 00:40
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|