Autor Beitrag
Ccenter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

Win7
C#
BeitragVerfasst: So 19.09.10 14:59 
Ich bin langsam am verzweifeln:
Ich habe einen langen String in dem ich einen bestimmten Textausschnitt durch einen anderen ersetzen will. Ich weiß allerdings nur womit der String aufhört und endet. Den Mittelteil kenne ich nicht, deshalb ist replace jetzt gerade nicht zu gebrauchen.

Zum Üben habe ich nun folgenden String genommen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbb-text:"hallo"-dddddddddddddddddddddddddddddddddddd
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa


Ich weiß der Teil fängt mit text:" an und hört mit einem " wieder auf. Dass dort hallo steht, weiß ich nicht.
Um den Teil nun zu entfernen und einen neuen einzusetzen habe ich folgendes geschrieben:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
int stIndex = strVar.IndexOf("text:\""0); //strVar ist der oben angegebene Text
int enIndex = strVar.IndexOf("\"", (stIndex+7)); //+7 damit er nicht das Anführungszeichen von text:" nimmt.
strVar = strVar.Remove(stIndex , enIndex);
strVar= strVar.Insert(stIndex, "text:\"Dieser Bereich wurde ersetzt\"");
MessageBox.Show(strVar);



Wenn ich mir nun aber das Ergebniss ausgeben lasse, fehlen am Ende ganz viele a's. Die d's sind komplett weg. Es scheint so als ob der enIndex zu hoch ist und zu viel vom String nach dem letzten " entfernt wird. Hat jemand eine Idee wo der Fehler liegt?
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: So 19.09.10 16:48 
Hallo,

das Problem ist diese Zeile:
ausblenden C#-Quelltext
1:
strVar = strVar.Remove(stIndex , enIndex);					

Bei der Methode Remove gibt man als ersten Parameter den Startindex an, und als 2. Parameter wird die Anzahl der Zeichen erwartet, dei aus dem String gelöscht werden sollen (also nicht Startindex und Endindex).
Also müsste das bei Dir so aussehen:
ausblenden C#-Quelltext
1:
strVar = strVar.Remove(stIndex,  enIndex - stIndex + 1);					

Oder besser mit einem regulären Ausadruck:
ausblenden C#-Quelltext
1:
string changedText = Regex.Replace(strVar, "text:\".+?\"""text:\"Dieser Bereich wurde ersetzt\"");					


LG, Marko

Für diesen Beitrag haben gedankt: Ccenter
Ccenter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

Win7
C#
BeitragVerfasst: Mo 20.09.10 14:51 
Was für ein blöder Fehler :D
Danke, es funktioniert jetzt.
IsNull
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97
Erhaltene Danke: 11


VS 2010, C#, AHK
BeitragVerfasst: Do 23.09.10 10:37 
An deiner Stelle würde ich mich mal in RegEx einlesen, dann kannst du soche String-such Unterfangen in Zukunft in einem Einzeiler(zumindest die Logik ist in einer Zeile) lösen.

In diesem Falle würde das RegEx Match-Pattern so aussehen:

ausblenden Quelltext
1:
text:"(.*?)"					
Ccenter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

Win7
C#
BeitragVerfasst: So 10.10.10 19:39 
So ich stehe nun wieder vor dem Problem und möchte die Regexvariante verwenden.
Dazu habe ich mir dieses Tut angeguckt: www.mycsharp.de/wbb2...d.php?threadid=41009.

Ich habe jetzt das Pattern von IsNull benutzt:
ausblenden C#-Quelltext
1:
2:
Regex userRegex = new Regex("text:(.*?)");
textBoxTEXT.Text = ...


Ich möchte nun in die Textbox den Inhalt von (.*?) einsetzen. Aber dazu hab ich nichts gefunden. Wie macht man das?
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: So 10.10.10 20:11 
Die Methode Regex.Matches gibt dir die Stellen zurück, an denen das Suchmuster gefunden wird, und weitere Informationen darüber. In deinem Fall also genau eine Übereinstimmung. Außerdem brauchst du die Eigenschaft Groups, die die Werte für die Gruppen (im regulären Ausdruck in runden Klammern) enthält.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
MatchCollection matches = userRegex.Matches(inputString);
if (matches.Count >= 1) {
  GroupCollection groups = matches[0].Groups;
  // eine GroupCollection enthält an Position 0 immer den gesamten Treffer, also müssen 2 Elemente vorhanden sein
  if (groups.Count >= 2)
    value = groups[1].Value;
}