Franz Handlos: Regexp: Suche bis zu einer bestimmten Zeichenfolge

Guten Abend,

ich möchte aus einem String einen Teilstring ermitteln. Dabei soll der RegExp allerdings nur solange matchen, bis er auf eine bestimmte Zeichenfolge stösst. Etwa wie folgt:

Dies ist ein schöner Tag

Bis zum Wort 'schöner' soll gematched werden. Mein Problem ist, dass ich zwar weiss wie ich bis zu einem bestimmten Zeichen suche ([^X]+), nicht aber, wie ich bis zu einer bestimmten Zeichenfolge suche.

Weiss jemand wie das geht?

Schönen Abend noch,
Franz

  1. Hi,

    Bis zum Wort 'schöner' soll gematched werden. Mein Problem ist, dass ich zwar weiss wie ich bis zu einem bestimmten Zeichen suche ([^X]+), nicht aber, wie ich bis zu einer bestimmten Zeichenfolge suche.

    Wenn du bis zu einem Wort suchen willst musst du
    /^.*?Wort/
    wenn du bis zum letzten vorkommen von einem Wort suchen willst musst du
    /^.*Wort/ schreiben.

    Wenn mindestens ein Zeichen vor dem Wort stehen soll musst du "*" durch "+" ersetzen.

    Ob es Probleme mit dem "ö" gibt weiß ich nicht, denke aber nicht.

    mfG,
    steckl

    1. Hallo steckl,

      ich habe echt den Wald vor lauter Bäumen nicht gesehen, obwohl sowas eigentlich zu den einfacheren Dingen gehört...

      MFG
      Franz

    2. gudn tach!

      Wenn du bis zu einem Wort suchen willst musst du
      /^.*?Wort/
      wenn du bis zum letzten vorkommen von einem Wort suchen willst musst du
      /^.*Wort/ schreiben.

      wenn "Wort" wirklich bloss so ein simpler string ist, sind haeufig gewoehnliche string-positions-funktionen die bessere wahl, also sowas wie

      substring(0 bis position("wort" in string)-1 von string)

      wenn "wort" komplizierter, also selbst wieder ein regexp ist, dann gibt es uebrigens auch neben den bereits genannten moeglichkeiten noch "zero-width look-ahead assertions", vor allem im falle von suchen-und-ersetzen sind die nuetzlich.

      beispiel:

      /^(.*?)[fF]oo/
      speichert alles, was vor dem ersten "foo" oder "Foo" kommt in $1.

      soll das alles ersetzt werden, ohne dass "foo" bzw. "Foo" angetastet werden, dann kommen die "zero-width look-ahead assertions" zum einsatz:

      s/^(.*?)[fF]oo/$1/
      wuerde naemlich "foo" bzw. "Foo" ueberschreiben.

      s/^(.*?)(?=[fF]oo)/$1/
      wuerde ebendies nicht tun.

      prost
      seth