Andinho: Regex: zweites Wort ohne Leerzeichen

Hallo zusammen,

ich würde gerne das zweite Wort "München" ohne Leerzeichen extrahieren: "Haltestelle München (wird bearbeitet)" Da der Text vor und hinter München immer derselbe ist war mein Ansatz mit Gruppierungen folgender:

(?!Haltestelle )(.*)(?! \(wird bearbeitet\))

Leider ohne Erfolg, kann mir jemand weiterhelfen? Zum Testen des Regex habe ich übrigens die Seite "https://www.regextester.com" verwendet.

Danke und Grüsse

Andinho

  1. Hallo Andinho,

    ich würde gerne das zweite Wort "München" ohne Leerzeichen extrahieren: "Haltestelle München (wird bearbeitet)" Da der Text vor und hinter München immer derselbe ist war mein Ansatz mit Gruppierungen folgender:

    (?!Haltestelle )(.*)(?! \(wird bearbeitet\))

    Mal eine Herleitung: du möchtest einen String matchen, der mit Haltestelle beginnt. Also:

    /^Haltestelle /
    

    Danach kommt ein Wort ohne Leerzeichen. Das möchtest du in einer Backref speichern. Also:

    /^Haltestelle (\S+)/
    

    Danach das kannst du dir eigentlich schon sparen. Wenn es aber darum geht, das Vorkommen in einem Text zu matchen, musst du den Anfangs-Anker entfernen und den Match noch etwas absichern; das kannst du, wie du schon richtig gedacht hast, über den nachfolgenden Text (wird bearbeitet) tun:

    /Haltestelle (\S+) \(wird bearbeitet\)/
    

    Danach sollte dein „München“ in der ersten Backreference stehen. Da du leider nicht angegeben hast, um welche Sprache es sich handelt, kann ich leider nicht genauer werden.

    Zum Testen des Regex habe ich übrigens die Seite https://www.regextester.com verwendet.

    Ja, die Seite ist klasse, die verlinke ich gerne. Hier mal das Beispiel von dir: https://www.regextester.com/?fam=110271

    LG,
    CK

    1. @@Christian Kruse

      Danach kommt ein Wort ohne Leerzeichen.

      Hier ist wohl ein Denkfehler. Nicht deiner; der war schon in der Problembeschreibung.

      Haltestelle Porta Westfalica (wird bearbeitet)

      LLAP 🖖

      --
      „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
      1. Hallo Gunnar,

        Danach kommt ein Wort ohne Leerzeichen.

        Hier ist wohl ein Denkfehler.

        Möglich, aber ich bin da nicht so sicher. Die Anforderung war sehr explizit. Deshalb habe ich sie so übernommen.

        Haltestelle Porta Westfalica (wird bearbeitet)

        Ja, möglich. Da muss der OP sich äußern 😀

        LG,
        CK

        1. Die Negation ^ wurde nicht mitkopiert. Jetzt geht es, dank dir!

          Viele Grüsse

    2. Hallo Christian

      Danke für die schnelle Rückmeldung. Der Regex wird mittels Eclipse Command Language angewandt. Da Eclipse auf Java basiert kann ich nur vermuten, dass es auch darauf basiert.

      Leider funktioniert dein Code bei mir überhaupt nicht. Der REgextester selektiert alles und innerhalb meiner RCPTT Testumgebung kommt es gar zum Fehler.

      Viele Grüsse

      Andinho

      1. Hallo Andinho,

        Danke für die schnelle Rückmeldung. Der Regex wird mittels Eclipse Command Language angewandt. Da Eclipse auf Java basiert kann ich nur vermuten, dass es auch darauf basiert.

        Tut mir leid, um Eclipse habe ich immer einen weiten Bogen gemacht. Damit kenne ich mich nicht aus.

        Leider funktioniert dein Code bei mir überhaupt nicht. Der REgextester selektiert alles […]

        Klar. Du musst, um den Match einzuschränken auf die richtigen Fundstellen, die Umgebung genauer spezifizieren. Das hatte ich ja versucht zu erklären. Dein „München“ steht dann in der ersten back reference (in JS z.B. wäre es RegExp.$1).

        und innerhalb meiner RCPTT Testumgebung kommt es gar zum Fehler.

        Hast du vielleicht die // drin gelassen und Eclipse will sie nicht?

        LG,
        CK

    3. Tach!

      Zum Testen des Regex habe ich übrigens die Seite https://www.regextester.com verwendet.

      Ja, die Seite ist klasse, die verlinke ich gerne. Hier mal das Beispiel von dir: https://www.regextester.com/?fam=110271

      Wo sieht man denn da das Ergebnis, außer wenn man per Zufall mit dem Mauszeiger auf den Teststring kommt?

      dedlfix.

      1. Hallo dedlfix,

        Zum Testen des Regex habe ich übrigens die Seite https://www.regextester.com verwendet.

        Ja, die Seite ist klasse, die verlinke ich gerne. Hier mal das Beispiel von dir: https://www.regextester.com/?fam=110271

        Wo sieht man denn da das Ergebnis, außer wenn man per Zufall mit dem Mauszeiger auf den Teststring kommt?

        Man positioniert geziehlt den Mauszeiger auf dem Teststring 😝

        LG,
        CK

  2. @@Andinho

    ich würde gerne das zweite Wort "München" ohne Leerzeichen extrahieren: "Haltestelle München (wird bearbeitet)" Da der Text vor und hinter München immer derselbe ist war mein Ansatz mit Gruppierungen folgender:

    (?!Haltestelle )(.*)(?! \(wird bearbeitet\))

    Wenn du den Text davor und danach nicht brauchst: Haltestelle (.*) \(wird bearbeitet\).

    Was hast du eigentlich damit vor?

    LLAP 🖖

    --
    „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
  3. Mittels (?: )([^ ]*)(?: ) bekomme ich zwar das zeite Wort aber eben nur mit den Leerzeichen...

    1. Hi,

      Mittels (?: )([^ ]*)(?: ) bekomme ich zwar das zeite Wort aber eben nur mit den Leerzeichen...

      Entweder group 1 nutzen statt des Gesamtmatches oder mit Lookarounds arbeiten

      cu,
      Andreas a/k/a MudGuard

  4. Tach!

    ich würde gerne das zweite Wort "München" ohne Leerzeichen extrahieren: "Haltestelle München (wird bearbeitet)" Da der Text vor und hinter München immer derselbe ist war mein Ansatz mit Gruppierungen folgender:

    (?!Haltestelle )(.*)(?! \(wird bearbeitet\))

    Du verwendest am Anfang eine Lookahead Assertion auch wenn du eigentlich behind schauen möchtest. Aber eigentlich brauchst du keine Assertions sondern nur eine Gruppe um den gesuchten Teil:

    Haltestelle (.*) \(wird bearbeitet\)

    dedlfix.

    1. Hat ebenfalls geklappt, danke!

  5. Hallo Andinho,

    die Sequenz (!Haltestelle ) ist ein negativer Lookahead, damit matcht die Regex einen beliebigen String (.*), der nicht mit "Haltestelle" beginnt. Das ist ab Position 2 der Fall: altestelle.

    Mit Lookaheads kommst Du deshalb nicht weiter. Was Dir helfen könnte, wäre ein Blick in die entgegengesetzte Richtung: ein positiver Lookbehind (?<=Haltestelle ), der wird aber nicht von allen Regex-Engines unterstützt.

    Wenn doch:

    (?<=Haltestelle ).*(?= \(wird bearbeitet\))
    

    Das würde auch für Haltestelle Porta Westfalica (wird bearbeitet) funktionieren. Oder Soest (Westf.)

    Beachte die Spaces in Lookbehind und Lookahead, damit Du das Leerzeichen nicht im Match hast. Was nicht funktioniert, ist

    Haltestelle  München   (wird bearbeitet)
    

    Auch mit einem \s+ in den Lookbehind/Lookahead nimmt er nur eine Leerstelle weg.

    Um mehrfache Leerstellen wegzubekommen, müsste man das Ganze direkt angehen, das würde aber voraussetzen, dass Du auf matched groups zugreifen kannst. Der Ausdruck

    /Haltestelle\s+(?<name>.*)\s+\(wird bearbeitet\)/
    

    liest sich besser und ist auch - meine ich - performanter als diese Lookarounds, aber du musst dann eben auf Groups zugreifen können. In JavaScript sähe das so aus:

    let haltestelle = "Haltestelle Dingenskirchen (wird bearbeitet)";
    
    let rx = /Haltestelle\s+(?<name>.*)\s+\(wird bearbeitet\)/;
    let match = rx.exec(haltestelle);
    
    console.log("Finde Haltestelle " + match.groups.name);
    

    Rolf

    --
    sumpsi - posui - clusi