Regex: zweites Wort ohne Leerzeichen
Andinho
- regex
0 Christian Kruse0 Gunnar Bittersmann0 Andinho0 MudGuard
0 dedlfix0 Andinho
0 Rolf B
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
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
@@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 🖖
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
Die Negation ^ wurde nicht mitkopiert. Jetzt geht es, dank dir!
Viele Grüsse
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
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
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.
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
@@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 🖖
Mittels
(?: )([^ ]*)(?: )
bekomme ich zwar das zeite Wort aber eben nur mit den Leerzeichen...
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
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.
Hat ebenfalls geklappt, danke!
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