Problem beim Text ersetzen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Problem beim Text ersetzen

    Guten Abend. Ich arbeite derzeitig an einem Programm welches eine Art ROT1-Verschlüsselung anwendet. Ich weiß, dass ROT1 (bzw. ROT13) keine (gute) Verschlüsselung ist, der Text soll aber auch nicht verschlüsselt werden sondern nur "verschönert" werden ;) Genauer kann Ich den Zweck jetzt irgendwie nicht beschreiben...

    Auf jeden Fall: Bei meinem derzeitigen Code wird aus einem A kein B sondern ein C:

    VB.NET-Quellcode

    1. TextBox1.Text = TextBox1.Text.Replace("A", "B")
    2. TextBox1.Text = TextBox1.Text.Replace("B", "C")


    Ist ja eigentlich auch klar, da die A's erst zu einem B werden, dann aber aus den B's C's gemacht werden. Nun aber meine Frage: Wie bekomme Ich es (ohne RegEx) hin, dass aus den A's B's und aus den B's C's werden, ohne dass das vorher umgewandelte A (B) auch zu einem C wird. Später sollte das ganze natürlich mit allen 26 Buchstaben funktionieren.

    LG
    Moin,

    einfach die Reihenfolge invertieren.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Stimmt, ist performanter. Würde evtl. nen Array machen mit allen Buchstaben und dann den Index der aktuellen Char im Enumerator im Array rausfinden und dies mit dem nächsten Element ersetzen. Kann man schön LINQ anwenden.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Würde ich sogar über ein Dictionary machen.

    VB.NET-Quellcode

    1. Dim source As String = "AB"
    2. Dim destin As String = "BC"
    3. Dim input As String = "Dies ist ein Versuchstext, der ohne diesen Zusatz weder A, noch B enthielte."
    4. 'source[i] und destin[i] zusammenschweißen (sodass (source.'A', destin.'B') und (source.'B', destin.'C') usw. aneinanderhängen
    5. 'und daraus ein Wörterbuch konstruieren, sodass die Abfrage mit Schlüssel 'A' eben 'B' zurückgibt
    6. 'für den umkehrenden Vorgang müsste man also genau was tun?
    7. Dim translationDict = source.Zip(destin, AddressOf Tuple.Create).ToDictionary(Function(x) x.Item1, Function(x) x.Item2)
    8. 'Das Resultat wird in einem StringBuilder abgelegt
    9. Dim builder As New System.Text.StringBuilder(input.Length)
    10. 'Jeden Char durchlaufen
    11. For Each c As Char In input
    12. Dim res As Char = Nothing
    13. 'Ein Replacement für den aktuellen Buchstaben suchen, wenn keines existiert, wird der ursprüngliche Buchstabe verwendet
    14. If Not translationDict.TryGetValue(c, res) Then res = c
    15. builder.Append(res) 'das Replacement anhängen
    16. Next
    17. 'String aus dem Stringbuilder erzeugen
    18. Dim result As String = builder.ToString()

    So sähe ein einfacher Ansatz aus.

    Gruß
    ~blaze~

    ~blaze~ schrieb:

    einfacher Ansatz

    *hust* :D

    Meine Lösung wäre etwas simpler gewesen, evtl auch etwas ranziger, aber poste es mal trotzdem. Dictionary ist nat. auch 'ne gute Idee, wenn man das mit entsprechenden Einträgen hat.

    VB.NET-Quellcode

    1. ​Dim letters = New () {"A"C, "B"C, "C"C, "D"C, "E"C, "F"C}
    2. Dim test As String = "CED"
    3. Dim builder = New StringBuilder()
    4. For Each c As Char In test
    5. builder.Append(letters(Array.IndexOf(letters, c) + 1))
    6. Next
    7. MessageBox.Show(builder.ToString())


    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    ichduersie schrieb:

    Bei meinem derzeitigen Code wird aus einem A kein B sondern ein C:
    Tausche die Reihenfolge beider Zeilen:

    VB.NET-Quellcode

    1. TextBox1.Text = TextBox1.Text.Replace("B", "C") ' Jetzt gibt es kein "B" mehr.
    2. TextBox1.Text = TextBox1.Text.Replace("A", "B") ' Jetzt gibt es kein "A" mehr.

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    C#-Quellcode

    1. MessageBox.Show(string.Concat("Dies ist ein Versuchstext, der ohne diesen Zusatz weder A, noch B enthielte.".Select((item) => Convert.ToInt16(item) + 1).Select(Convert.ToChar)));


    oder (falls nur Buchstaben und Zahlen)

    C#-Quellcode

    1. MessageBox.Show(string.Concat("Dies ist ein Versuchstext, der ohne diesen Zusatz weder A, noch B enthielte.".Select((item) => (Char.IsLetterOrDigit(item) ? Convert.ToInt16(item) + 1 : Convert.ToInt16(item))).Select(Convert.ToChar)));

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RushDen“ ()

    ponmalka schrieb:

    Funktioniert also auch nicht ganz richtig.
    Poste bitte mal eine vollständige Problembeschreibung.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Und nicht vergessen, dass Z durch A ersetzt werden muss

    VB.NET-Quellcode

    1. Dim newLetter as Char = Chr( ((Asc(c)-Asc("A"c)) + 1) Mod 26 + Asc("A"c )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ponmalka“ ()

    @ichduersie Dann probier mal folgendes:

    VB.NET-Quellcode

    1. TextBox1.Text = TextBox1.Text.Replace("A", "@A@")
    2. TextBox1.Text = TextBox1.Text.Replace("B", "@B@")
    3. ' ...
    4. TextBox1.Text = TextBox1.Text.Replace("@A@", "B")
    5. TextBox1.Text = TextBox1.Text.Replace("@B@", "C")
    6. ' ...
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ponmalka schrieb:

    Insgesamt 52 solcher zeilen
    kannst Du doch gaaaaanz locker in ein paar Zeilen Code packen. :thumbsup:
    Diese Zeilen verdeutlichen doch lediglich den Algorithmus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!