Autor Beitrag
passchecker
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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:
ausblenden 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); //Ergebnis ist abc101234)def10321)adc


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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 27.07.08 12:05 
hmm gibt es nicht auch die Möglichkeit mittels der IsMatch Funktion?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 27.07.08 12:09 
user profile iconChristian S. hat folgendes geschrieben:
So mächtig ist die Replace-Funktion eines Regex leider nicht.
Die hat einiges auf dem Kasten ;) .
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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! :idea:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
passchecker Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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.
ausblenden 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);//Alte Zahl: abc1234def321adc neue Zahl: abc123410def32110adc           
}
public string Replace(Match m)
  {
  return (m.Value+10);       
  }

@Christian
stimmt hast Recht, war natürlich Blödsinn^^
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Suche bei Google "OPENBOOK VISUAL C#"

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
passchecker Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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 :D

cu passchecker
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 31.07.08 22:51 
Du hast gar nicht gesagt, was Du nach meinen Hinweisen denn geändert hast? :nixweiss:

Was String- und Integer-Addition angeht. Lass Dir einfach mal das hier ausgeben:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 31.07.08 23:21 
hmm.. ja das ist mir eigtl klar :D
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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 31.07.08 23:27 
Hm. Eigentlich der richtige Ansatz :zustimm:

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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 01.08.08 00:12 
ok, hast recht.. bin nur schon ein bisschen nervös..
also hier is mein aktueller code:
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 01.08.08 00:32 
ahh danke gelöst !
hab des return davor vergessen also mein code sieht jetzt so aus:
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 01.08.08 00:40 
user profile iconpasschecker hat folgendes geschrieben:
ndlich fertig mit meinem Programm :)

:-)

user profile iconpasschecker hat folgendes geschrieben:
Vielen Dank Christan für deine Hilfe und vor allem deine Geduld ! :)
Kein Problem, auch in einem Forum zu fragen will gelernt sein. :beer: Tipp für die Zukunft: Immer überlegen, was ein Fremder, der nicht sieht was Du siehst, über Dein Programm wissen kann :-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".