2016-05-18 12 views
0

Was ich tun möchte, ist alles "A" in einer Zeichenfolge mit "Bb" zu ersetzen. aber es wird nur mit der ursprünglichen Zeichenfolge in der neuen Zeichenfolge Schleife.For-Schleife: Ändern der Schleife Bedingung, während es Schleife ist

zum Beispiel:

AAA
bbaa
BbBbA

und stoppt dort, weil die ursprüngliche Zeichenfolge nur eine Länge von 3 hat es nur bis zum 3. Index liest und nicht den Rest.

Dim txt As String 
    txt = output_text.Text 

    Dim a As String = a_equi.Text 

    Dim index As Integer = txt.Length - 1 
    Dim output As String = "" 

    For i = 0 To index 
     If (txt(i) = TextBox1.Text) Then 
      output = txt.Remove(i, 1).Insert(i, a) 
      txt = output 
      TextBox2.Text += txt + Environment.NewLine 

     End If 
    Next 
End Sub 
+2

haben Sie versucht, Inbuild-Funktion von vb.net String ersetzen output = input.Replace ("A", "Bb") –

+0

Verwenden Sie einen StringBuilder und erstellen Sie eine neue Zeichenfolge die Substitutionszeichenfolge oder das aktuelle Zeichen anhängen. Versuchen Sie nicht, die gleiche Eingabezeichenfolge zu ersetzen. – Steve

+0

Kannst du nicht einfach eine 'while-Schleife' verwenden? Du kannst alle gewünschten Prüfungen machen und Änderungen an der Zeichenkette vornehmen, dann verlasse die Schleife, sobald du zufrieden bist. – nora

Antwort

0

Ich denke, das lässt uns für eine String.ReplaceFirst Funktion suchen. Da es keinen gibt, können wir einfach diese Funktion schreiben. Dann wird der Code, der es erfordert wird viel besser lesbar, weil es schnell klar ist, was es (aus dem Namen der Funktion.) Tut

Public Function ReplaceFirst(searched As String, target As String, replacement As String) As String 

    'This input validation is just for completeness. 
    'It's not strictly necessary. 

    'If the searched string is "null", throw an exception. 
    If (searched Is Nothing) Then Throw New ArgumentNullException("searched") 

    'If the target string is "null", throw an exception. 
    If (target Is Nothing) Then Throw New ArgumentNullException("target") 

    'If the searched string doesn't contain the target string at all 
    'then just return it - were done. 
    Dim foundIndex As Integer = searched.IndexOf(target) 
    If (foundIndex = -1) Then Return searched 

    'Build a new string that replaces the target with the replacement. 
    Return String.Concat(searched.Substring(0, foundIndex), replacement, _ 
     searched.Substring(foundIndex + target.Length, searched.Length - (foundIndex + target.Length))) 
End Function 

Beachten Sie, wie wenn Sie den Code unten zu lesen, Sie haben nicht einmal ausgeben müssen einen Moment, um herauszufinden, was es macht. Es ist lesbar. Während die Eingabezeichenfolge "A" enthält, ersetzen Sie das erste "A" durch "Bb".

Dim input as string = "AAA" 
While input.IndexOf("A") > -1 
    input = input.ReplaceFirst(input,"A","Bb") 
    'If you need to capture individual values of "input" as it changes 
    'add them to a list. 
End While 

Sie könnten die Funktion optimieren oder vollständig ersetzen. Was zählt ist, dass Ihr Code lesbar ist, kann jemand sagen, was es tut, und die ReplaceFirst Funktion ist testbar.

Dann lassen Sie uns sagen, dass Sie eine andere Funktion wollte, dass Sie alle „Versionen“ des Eingabestring gab als der Zielstring ersetzt:

Public Function GetIterativeReplacements(searched As String, target As String, replacement As String) As List(of string) 
    Dim output As New List(Of String) 
    While searched.IndexOf(target) > -1 
     searched = ReplaceFirst(searched, target, replacement) 
     output.Add(searched) 
    End While 
    Return output 
End Function 

Wenn Sie

rufen
dim output as List(of string) = GetIterativeReplacments("AAAA","A","Bb") 

Es ist gehen, um eine Liste der Zeichenketten zurück zu geben, die

BbAAA, BbBbAA, BbBbBbA, BbBbBbBb 

enthalten Es ist fast immer gut zu kee p Methoden kurz. Wenn sie zu lang werden, brich sie einfach in kleinere Methoden mit klaren Namen. Auf diese Weise versuchen Sie nicht, eine große, lange Funktion zu lesen und zu verfolgen und zu testen. Das ist schwierig, egal ob du ein neuer Programmierer bist oder nicht. Der Trick ist nicht in der Lage zu sein, lange, komplexe Funktionen zu erstellen, die wir verstehen, weil wir sie geschrieben haben - es schafft kleine, einfachere Funktionen, die jeder verstehen kann.

+0

Vielen Dank dafür! Ich habe mein Programm abgeschlossen. – MazoKisto

0

Überprüfen Sie Ihre Kommentare für eine bessere Lösung, aber für die Zukunft sollten Sie eine while-Schleife statt einer for-Schleife verwenden, wenn Ihr Zustand zu ändern wird, und Sie wollen, dass der Wandel Rechnung zu tragen.

Ich habe ein einfaches Beispiel unten gemacht, damit Sie es verstehen. Wenn Sie das gleiche mit einer for-Schleife versucht, dann würden Sie nur bekommen „eins“ „zwei“ und „drei“ gedruckt, da die for-Schleife nicht ‚sehen‘, dass vals

Dim vals As New List(Of String) 
    vals.Add("one") 
    vals.Add("two") 
    vals.Add("three") 

    Dim i As Integer = 0 
    While i < vals.Count 
     Console.WriteLine(vals(i)) 
     If vals(i) = "two" Then 
      vals.Add("four") 
      vals.Add("five") 
     End If 
     i += 1 
    End While 
+0

Wie verwende ich while-Schleife, um den Zustand zu ändern? – MazoKisto

0

geändert wurde, ich würde um eine while-Schleife schreiben Sie Ihre Frage zu beantworten, aber realisiert (mit Hilfe von anderen), dass Sie konnte .replace(x,y) nur

Output.Text = Input.Text.Replace("A", "Bb") 

'Input = N A T O 
'Output = N Bb T O 

Edit: Es ist wahrscheinlich eine bessere Alternative, aber ich kritzelte schnell diese Schleife nach unten, Hoffnung es hilft.

Sie haben Ihre neue und nicht vollständig verstanden while loops. Also, wenn Sie nicht verstehen functions entweder oder wie zu pass arguments zu ihnen, würde ich vorschlagen, dass auch suchen.

Dies ist Ihr Event, es kann ein Button-Klick oder Textbox-Textänderung sein.

'Cut & Paste into an Event (Change textboxes to whatever you have input/output) 

    Dim Input As String = textbox1.Text 

    Do While Input.Contains("A") 

     Input = ChangeString(Input, "A", "Bb") 

     ' Do whatever you like with each return of ChangeString() here 

    Loop 

    textbox2.Text = Input 

Das ist Ihre Funktion, mit 3 Argumente und einen Rückgabewert,

' Cut & Paste into Code somewhere (not inside another sub/Function) 
Private Function ChangeString(Input As String, LookFor As Char, ReplaceWith As String) 

    Dim Output As String = Nothing 
    Dim cFlag As Boolean = False 

    For i As Integer = 0 To Input.Length - 1 
     Dim c As Char = Input(i) 

     If (c = LookFor) AndAlso (cFlag = False) Then 
      Output += ReplaceWith 
      cFlag = True 
     Else 
      Output += c 
     End If 

    Next 

    Console.WriteLine("Output: " & Output) 
    Return Output 

End Function 
+0

Dies ersetzt alle 'A' gleichzeitig. Ich möchte es eins nach dem anderen machen. – MazoKisto

+0

Ich bin mir nicht sicher, ob die Änderungen in Ihren E-Mails geändert werden oder nicht, aber ich habe meine Antwort entsprechend Ihren Anforderungen bearbeitet. Getestet und funktioniert, Sie können die While-Schleife entfernen, wenn Sie es nur manuell immer und immer wieder tun wollen, Es wird entfernen und ersetzen, was Sie als Argumente angeben – nora

0

Wenn Sie eins nach dem anderen statt der Verwendung ersetzen wollen in Ihrem Code aufgerufen werden kann Ersetzen Funktion können Sie eine while-Schleife verwenden, um nach dem Index Ihres Suchzeichens/strings zu suchen, und dann ersetzen/einfügen an diesem Index.

Sub Main() 
    Dim a As String = String.Empty 
    Dim b As String = String.Empty 
    Dim c As String = String.Empty 
    Dim d As Int32 = -1 
    Console.Write("Whole string: ") 
    a = Console.ReadLine() 
    Console.Write("Replace: ") 
    b = Console.ReadLine() 
    Console.Write("Replace with: ") 
    c = Console.ReadLine() 

    d = a.IndexOf(b) 
    While d > -1 
     a = a.Remove(d, b.Length) 
     a = a.Insert(d, c) 
     d = a.LastIndexOf(b) 
    End While 
    Console.WriteLine("Finished string: " & a) 
    Console.ReadLine() 
End Sub 

Ausgabe würde wie folgt aussehen:

Whole string: This is A string for replAcing chArActers. 
Replace: A 
Replace with: Bb 
Finished string: This is Bb string for replBbcing chBbrBbcters. 
Verwandte Themen