Gast: Reguläre Ausdrücke

Hallo, wie kann ich in einem regulären Ausdruck darstellen:

Finde 'und' aber nicht 'Hund', 'Bund', ....?

  1. Dieser Beitrag wurde gelöscht: Inhalt ist leider Unsinn
  2. @@Gast

    wie kann ich in einem regulären Ausdruck darstellen:

    Finde 'und' aber nicht 'Hund', 'Bund', ....?

    Welche „und“ willst du finden? Die nach einem Leerzeichen? / und/. Findet aber nicht das „und“ in „(und“.

    Vermutlich ist die „Wortgrenze“ \b was für dich – auch wenn das völlig schwachsinnig implementiert wurde. Als „Wortzeichen“ zählen nämlich nur Buchstaben und Ziffern bis U+007E (ASCII-Zeichen). \bund\b findet demzufolge auch fälschlicherweise die „und“ in „äund“ und „undä“.

    😷 LLAP

    --
    “When I was 5 years old, my mother always told me that happiness was the key to life. When I went to school, they asked me what I wanted to be when I grew up. I wrote down ‘happy.’ They told me I didn’t understand the assignment, and I told them they didn’t understand life.” —John Lennon
    1. Hallo Gunnar,

      je nach Regex-Engine kann man die Unicode-Kategorie verwenden. \p{L} matcht auch Umlaute, bzw die Negierung \P{L} matcht keine.

      /\P{L}und\P{L}/ funktioniert - als erster Ansatz - in PHP, Java oder C# sofort. In JavaScript muss man der Regex die u Option hinzufügen.

      Nachteilig ist daran, dass nicht nur das "und" gematcht wird, sondern auch das Nichtwortzeichen davor und dahinter. Man muss also das "und" in Klammern setzen und auf die Capture-Gruppe zugreifen, oder man verwendet Assertions (negative lookbehind und negative lookahead):

      /(?<!\p{L})und(?!\p{L})/

      Auch dafür ist in JavaScript das u Flag nötig.

      Diese Regex besteht aus drei Teilen:

      (?<!\p{L}) - dies ist ein "zero-width negative lookbehind". Ein "lookbehind" bedeutet: Schau Dir an, was vor dem Treffer kommt. (?<!...)und meint damit: Wenn Du ein "und" findest, guck Dir die Zeichen vor dem "und" an. "negative lookbehind" meint: Das, was da in den Klammern steht, darf nicht gefunden werden. Und "zero width" sagt: Guck's Dir nur an. Aber betrachte es nicht als Teil des Treffers. Also zusammengefasst: Prüfe, ob vor dem "und" kein Unicode-Buchstabenzeichen steht.

      und - genau das

      ``(?!\p{L})` - Das ist das Vorwärtsgegenstück zu ?<!, es prüft das Zeichen hinter dem "und".

      Probiert mit regex101.com und regexstorm.net, es findet ein "und", dem weder ein Unicode-Letter vorangestellt ist noch einer nachfolgt.

      Findet also auch das "und" in "und123".

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Hi,

        (?<!\p{L}) - dies ist ein "zero-width negative lookbehind".

        Ist ein Look-Around nicht immer zero-width?

        Es ist doch gerade der Sinn der Look-Arounds, nichts zum Suchtreffer beizutragen, sondern nur Bedingungen für die Umgebung festzulegen.

        cu,
        Andreas a/k/a MudGuard

        1. Hallo MudGuard,

          Ist ein Look-Around nicht immer zero-width?

          ja, schon. "zero-width assertion" ist in gewissem Sinne eine Tautologie. Ich bin durch .net zu den Regexen gekommen, und in der .net Doku steht da immer "zero-width" dabei. In der Perl-Doku findet man den Begriff auch.

          Keine Ahnung, wer die Assertions überhaupt in die Regexe eingeführt hat, vermutlich war's Larry Wall mit Perl, was in PCRE einging. BREs oder EREs in POSIX enthalten sie nicht.

          Rolf

          --
          sumpsi - posui - obstruxi
          1. @@Rolf B

            Keine Ahnung, wer die Assertions überhaupt in die Regexe eingeführt hat

            und vergessen hat, dabei den Namen zu ändern, denn reguläre Ausdrücke sind das ja nicht.

            😷 LLAP

            --
            “When I was 5 years old, my mother always told me that happiness was the key to life. When I went to school, they asked me what I wanted to be when I grew up. I wrote down ‘happy.’ They told me I didn’t understand the assignment, and I told them they didn’t understand life.” —John Lennon
  3. Tach!

    wie kann ich in einem regulären Ausdruck darstellen:

    Finde 'und' aber nicht 'Hund', 'Bund', ....?

    /[^HB]und/

    Nach dem B kannst du noch einfügen, wofür die vier Punkte stehen sollen.

    Ich glaube aber, du hast nicht genau genug formuliert, was oder was nicht sein soll. Wenn du das machst, könntest du vielleicht auch den Ausdruck selbst finden. Meinst du etwa, dass vor (und nach) dem "und" kein Buchstabe (vielleicht nebst weiteren Zeichen) sein soll, oder eine Wortgrenze sein muss?

    dedlfix.