String ersetzen

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

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von benji2012.

    String ersetzen

    Hallo zusammen,

    Möchte im String folgendes ersetzen:

    AB DS RF C21.8 DF

    durch

    AB DS RF C=(21.8) DF


    VB.NET-Quellcode

    1. ' Ersetzen von C durch C=()
    2. If line.Contains("C") And Not line.Contains(";") Then
    3. 'Ersetzen des Anfangs
    4. line = line.Replace("C", "C=(")
    5. 'Anfügen der Klammer am Ende ??
    6. line = line.Replace(" ", ")")
    7. End If


    Wie komme ich aber an das Leerzeichen nach C, um es durch eine Klammer zu ersetzen ? Indexof ? Stehe da irgendwie auf dem Schlauch, da es nicht immer das vierte Leerzeichen im String ist.

    benji2012 schrieb:

    nicht immer das vierte Leerzeichen
    Formuliere zunächst eine allgemeine Vorschrift verbal.
    Wenn die für alle Deine Muster funktioniert, gießen wir sie in Code.
    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!
    Splitte den ganzen String beim Leerzeichen und suche nach einem Item welches das "C" an erster Stelle hat.
    Bei diesem "Teilstück" kannst du C mit C=( ersetzen und einfach am Ende ein ) hinzufügen.
    Anschließend aus den Teilstücken einen neuen String per String.Join basteln.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Also;
    1. "ABC DEFG" in dem Fall:"ABC=)DEFG" ?
    2. "ABCDEFG" in dem Fall:"ABC=DEFG" ?
    3. "ABC D EFG" in dem Fall:"ABCDEFG)" ? String Ende wäre hier halt "am Ende"?

    Was @RodFromGermany damit meinte war wohl das du uns auch ein Muster vorgibst.
    Wie sehen die Strings aus, welche du bearbeiten möchtest?
    Option Strict On!
    Danke erstmal für die Hilfe, also gern etwa verständlicher.
    Nur ein C mit nachfolgenden Zahlen soll betrachtet werden:

    AB CD EF --> ohne Änderung, da keine Zahlen nach C
    AB C21.8 EF --> AB C=(21.8) EF
    AB C21.8 --> AB C=(21.8) letzter Teilstring im String dennoch ")"
    C21.8 --> C=(21.8)
    AC4B --> AC=(4)B


    Ich hätte an eine Logik gedacht, die an das Ende jeder Zahl die mit C beginnt eine Klammer einfügt.

    benji2012 schrieb:

    etwas verständlicher
    Bitte sofort im Eröffnungspost.
    Ersetze den numerischen Ausdruck x nach einem "C" durch =(x).
    Das ist was für die RegEx-Experten.
    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!
    Hallo benji2012,

    Ich würde das mit Regex lösen. Damit wird's sogar zu einem Einzeiler:

    VB.NET-Quellcode

    1. Dim StrNew = Text.RegularExpressions.Regex.Replace(StrOld, "(?<=C)(\d*(\.\d*|))", "=($0)")


    EDIT: Nach dem Post von RFG geschrieben. Passt aber wie die Faust aufs Auge. :D
    Danke vielmals, funktioniert perfekt.

    Habe mich gerade mal hier belesen, wie die REGEX-Ausdrücke zu verstehen sind, aber leider verstehe ich deinen Ausdruck nicht ganz.

    RegEx Tutorial - Blutige Anfänger und Fortgeschrittene

    VB.NET-Quellcode

    1. Regex.Replace(StrOld, "(?<=C)(\d*(\.\d*|))", "=($0)")


    Vlt. kannst du den mir noch ein wenig erklären, für das nächste Mal.

    VB.NET-Quellcode

    1. (?<=C)

    Sicher ob das C einmal im Text vorkommt

    VB.NET-Quellcode

    1. (\d*(\.\d*|))

    ??

    VB.NET-Quellcode

    1. =($0)

    Den Zahlenterm der gefunden wurde in den Ausdruck einfügen (hier Klammern)
    (?<=C): Das nennt man einen LookAhead. Er schaut, ob vorher ein C auftaucht. Nur dann prüft er weiter. Aber das Gefundene - der Match - beinhaltet dieses C nicht.
    (\d*(\.\d*|)): Die Klammern kennzeichnen sogenannte Groups in einem Match. Das \d* matcht alle Zahlen von beliebiger Länge(eigentlich könnte man das *="0 oder mehr" auch durch ein +="1 oder mehr" ersetzen). In der Untergruppe kommt entweder ein Punkt gefolgt von einer Zahl(auch hier wäre + statt * wohl besser) beliebiger Länge ODER(|) nichts mehr(für Ganzzahlen).
    =($0): Ersetze den Match mit =(...), wobei das $0 bei ... die erste Gruppe im Match ist((\d*(\.\d*|))). Wenn du z.B. die zweite Gruppe im Match einsetzen willst, wäre dass dann logischerweise ein $1.

    Grüsse,

    Higlav