Problem mit Regex Pattern - Ende soll ein bestimmtes Zeichen sein.

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

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Problem mit Regex Pattern - Ende soll ein bestimmtes Zeichen sein.

    Hallo RegEx Profis!

    Ich beschäftige mich jetzt schon eine ganze Zeit mit Regular Expressions und bin kurz vor dem Heulen!

    Ich habe z.B folgende Stringvarianten:

    Quellcode

    1. "01/33-4816 ..;03/33-4925 ..;05/33-4927 ..\000"
    2. "01/33-1141 .."
    3. "02/33-1006 01;03/33-1007 01;04/33-1008 02"
    4. "01/33-1003 01;01/33-1004 01;\000"


    Der Aufbau ist dabei immer gleich. Lediglich die Endung unterscheidet sich und hat entweder die Variante .." oder zwei ziffern und " oder ..; oder zwei ziffern und ; oder ..\ oder zwei ziffern und \
    Hinter diesen Zeichen soll also am Ende abgeschnitten werden: " ; \
    Was weg muss, ist z.B die Endung 000" im ersten und letzten String.
    Da ich für die Weiterverarbeitung ein Split machen möchte benötige ich die o.g. Zeichen am Ende.

    Mein Ansatz sieht wie folgt aus:

    Quellcode

    1. Regex.Matches(String, "\d{2,2}/33(.)(.*) (.*)\;")
    2. oder
    3. Regex.Matches(String, "\d{2,2}/33(.)(.*)\s[0-9";.]*\\")


    Mitlerweile habe ich gefühlte 200 Varianten ausprobiert und das Internet auf Links gedreht.
    Ich begreife es einfach nicht.

    Für eine Hilfestellung wäre ich SEHR dankbar!

    Allen ein entspanntes Wochenende.

    Schöne Grüße,

    Mark
    Bilder
    • 2018-08-17 16_58_07-Start.png

      40,38 kB, 958×680, 54 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Ich verstehe irgendwie nicht, was du genau willst. Den Original Text kennen wir nun, zeig mal, was du daraus brauchst.
    Bspl:
    Original:
    12xx345
    Wanted:
    xx3
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    Kannst du bitte mal ein konkretes Beispiel nennen.
    Wie sähe exemplarisch der Output für

    Quellcode

    1. ​"01/33-4816 ..;03/33-4925 ..;05/33-4927 ..\000"
    aus?

    So:

    Quellcode

    1. ​"01/33-4816 ..;03/33-4925 ..;05/33-4927 .."

    oder

    Quellcode

    1. ​"01/33-4816 ..;03/33-4925

    ?
    Und Gott alleine weiß alles am allerbesten und besser.

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

    Ok, ich habe mich definitiv ungeschickt ausgedrückt.

    Das Ende hat immer .. oder zwei ziffern und dahinter dann das jeweilige nächste Sonderzeichen. Alles danach muss weg.

    Also wäre der Input/Output bei den Strings folgendermaßen:

    Quellcode

    1. Input: "01/33-4816 ..;03/33-4925 ..;05/33-4927 ..\000"
    2. Output: "01/33-4816 ..;03/33-4925 ..;05/33-4927 ..\


    und

    Quellcode

    1. Input: "01/33-1141 .."
    2. Output: "01/33-1141 .."


    und

    Quellcode

    1. Input: "02/33-1006 01;03/33-1007 01;04/33-1008 02"
    2. Output: "02/33-1006 01;03/33-1007 01;04/33-1008 02"


    bzw. der letzte String:

    Quellcode

    1. Input: "01/33-1003 01;01/33-1004 01;\000"
    2. Output: "01/33-1003 01;01/33-1004 01;


    Hoffe das ist etwas verständlicher.

    Gruß
    Dann hätte ich aber den Fall, dass mein Ergebnis zwischendurch wieder leere, bzw. unbrauchbare Zeilen erhält.
    Das heißt ich müsste dann dort wieder prüfen und an vielen Stellen im Programm anpassen etc.

    Würde es denn eine Variante mit RegEx geben? Oder meinst Du es gibt da keine Aussicht auf Erfolg?

    Mit folgendem Pattern bin ich ja schon fast am Ziel, es fehlen nur noch die Anführungsstriche beim zweiten und dritten String
    aber dann wird auch der erste wieder bis zum Schluss gelesen.

    Quellcode

    1. \d{2,2}/33(.)(.*) (.*)[0-9.]+[\\.;]



    "01/33-4816 ..;01/33-4925 ..;01/33-4927 ..\000"

    "01/33-1141 .."

    "02/33-1006 01;03/33-1007 01;01/33-1008 02"

    "01/33-1003 01;01/33-1004 01;\000"

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    So kompliziert ist das eigentlich nicht.

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

    Dein String endet entweder mit 2 Punkten oder 2 Zahlen und dann einem Sonderzeichen. Und auf mehr musst du doch auch nicht prüfen.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Vainamo“ ()

    Herzlichen Dank für Eure Unterstützung!!!
    Das bringt mich einen riesen Schritt weiter.

    Der Hinweis von Vainamo löst mein Problem fast zu 100%

    Verstehe aber nicht, wieso dann z.B auch dieses Ergebnis entstehen kann?

    Quellcode

    1. \d{2,2}/33.* (\.\.|\d\d).​


    "01/33 713010008..;01/33 713010009..;01/33 713010010..;01/33 713010015..\000"

    Auch hier müsste es ja eigentlich bis zum ..\ weitergehen.

    Bei Deinem Beispiel steht ja der Punkt ganz am Ende, stellvertretend für irgendein Zeichen, können dort auch explizit Zeichen angegeben werden?

    Habt Ihr vielleicht noch eine Buchempfehlung oder einen Link, wo man eine vollständige Sammlung zum Thema findet?
    Finde irgendwie nur Seiten wo man das Gefühl hat die sind nicht vollumfänglich.

    Vielen Dank. :thumbsup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    mhoeftx schrieb:

    Verstehe aber nicht, wieso dann z.B auch dieses Ergebnis entstehen kann?

    In deinen Beispiel-Strings ist vor den beiden Zahlen bzw Punkten immer ein Leerzeichen, darauf basiert auch das Pattern von mir. Wie du sehen kannst, enthält der String

    "01/33 713010008..;01/33 713010009..;01/33 713010010..;01/33 713010015..\000"

    am Ende der von dir markierten Stelle ein Leerzeichen, 2 Zahlen und ein beliebiges Zeichen.

    mhoeftx schrieb:

    Bei Deinem Beispiel steht ja der Punkt ganz am Ende, stellvertretend für irgendein Zeichen, können dort auch explizit Zeichen angegeben werden?

    Wegen obenstehendem Problem MUSS man an der Stelle die Zeichen sogar explizit angeben, das geht ganz einfach, indem du alle zulässigen Zeichen in eckige Klammern packst. Also wenn zum Beispiel ; und \ erlaubt sind:

    .* (\.\.|\d\d)[;\\]

    mhoeftx schrieb:

    Habt Ihr vielleicht noch eine Buchempfehlung oder einen Link, wo man eine vollständige Sammlung zum Thema findet?

    RegEx Tutorial - Blutige Anfänger und Fortgeschrittene

    Grüße
    Vainamo
    Habe auch erst beim ersten Testlauf gemerkt, dass es diese Konstellation ebenfalls gibt.

    Deine letzte Antwort hatte ich schon mal ausprobiert, allerdings habe ich da wieder das Problem, dass es nichts findet wenn es auf .." endet.
    Also z.B. bei dem ursprünglichen Beispielstring:

    "01/33-1141 .."

    Wenn ich in der eckigen Klammer noch " hinzufüge, übergeht er wieder das ; im folgenden String:

    "01/33-1003 01;01/33-1004 01;\000"

    Ich versuche nochmal weiter zu testen.
    Kann man das ganze vielleicht auch irgendwie zusammenfassen, also dass es entweder genau

    Quellcode

    1. .* (\.\.|\d\d)[;\\]
    oder

    Quellcode

    1. .* (\.\.|\d\d)["]
    entspricht?

    Teufelszeug irgendwie ...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    mhoeftx schrieb:

    "01/33-1141 .."

    Wo kommen denn jetzt 2 Punkte ohne alles wieder her? Kannst du bitte einmal alle möglichen Fälle untereinander reinpacken und jeweils anzeigen, was davon er finden soll?

    mhoeftx schrieb:

    Kann man das ganze vielleicht auch irgendwie zusammenfassen

    Naja, ich schrieb doch, dass du alle möglichen Zeichen in die eckigen Klammern packen kannst. Wenn du jetzt nicht nur Semikolon und Backslashes hast, sondern auch Anführungszeichen, dann packst du das " einfach mit in die eckigen Klammern.

    .* (\.\.|\d\d)[;\\"]

    Grüße
    Vainamo
    Eigentlich nur die bereits bekannten aus meinem zweiten Post, sowie der nachträglich aufgetauchte String.

    Konkret also:

    "01/33-4816 ..;01/33-4925 ..;01/33-4927 ..\000"

    "01/33-1141 .."

    "02/33-1006 01;03/33-1007 01;01/33-1008 02"

    "01/33-1003 01;01/33-1004 01;\000"

    "01/33 713010008..;01/33 713010009..;01/33 713010010..;01/33 713010015..\000"


    Alles was also gefunden werden soll ist rot markiert.

    Es bleibt beim Ende zwei Punkte oder Ziffern + Sonderzeichen, was ich nur nicht wusste, dass im Mittelteil auch nur Zahlen stehen können.

    Dein Beispiel aus dem letzten Post:
    .* (\.\.|\d\d)[;\\"]

    hatte ich ja bereits geschrieben, funktioniert in diesem Fall nicht.

    Edit:
    Vielleicht hätte ich noch hinzufügen sollen, die Anführungsstriche dienen nicht der Markierung des Strings, die gibt es im String tatsächlich.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    ich kann dir nur empfehlen: schnapp dir einen Regextester, und mach deine eigenen Geh-Versuche. Dann kannste selber auch Lösungen finden für String-Beispiele, die später noch auftauchen mögen.

    Zum beispiel der hier: Regextester - OpenSource
    Da kannste erfolgreiche Pattern kommentieren und abspeichern, und eine Syntax-Referenz ist auch dabei.