split.s: RegEx für Sätze

Hi

ich suche einen Regex der ein Ersatz zu substr darstellt und etwas abschneidet. Allerdings erst am nächsten Satzende, wenn der Gesamtstring länger ist als 20 Zeichen.

Zusammenfassung:
Wenn String länger ist als 20 Zeichen, dann soll er den Satz noch beenden, bevor er abschneidet.

Beispiel:
"Dies ist ein Satz der länger ist als 100 Zeichen. Hier folgt ein weiterer Satz"

Daraus würde dann werden:
"Dies ist ein Satz der länger ist als 100 Zeichen."

  1. Hi

    das Modul Text::Autoformat könnte Dein Vorhaben evntl. ganz elegant lösen...

    Viele Grüße,
    Hotte

  2. gudn tach!

    Wenn String länger ist als 20 Zeichen, dann soll er den Satz noch beenden, bevor er abschneidet.

    $str=~s/^(.{1,19}(?:$|.|[^.]+)).*/$1/;

    max. 19 beliebige zeichen, gefolgt von einem der drei folgenden dinger:
    a) stringende (abschliessender zeilenumbruch erlaubt)
    b) punkt
    c) beliebig langer string, der aus nicht-punkten besteht
    und schliesslich dem abzuschneidenen rest.

    klar ist, dass hier keine ueberpruefung erfolgt, ob bspw. der punkt hinter abkuerzungen ein satz-ende darstellt oder nicht. ebenso gibt es ja noch weitere satz-ende-zeichen wie z.b. ?, !, ... etc.

    prost
    seth

    1. $str=~s/^(.{1,19}(?:$|.|[^.]+)).*/$1/;

      etwas leserlich

      $str=~s/^
        (.{1,19}
        (?:
            $
          |
            .
          |
            [^.]+
         )             # da ist etwas falsch
         ).*
         /$1/x;

      Das lässt sich aber leicht beheben.
      Leider bleibt der Ansatz falsch, und unlösbar, wenn man den Terminus 'Satz' für Perl nicht spezifiziert und auch nicht verlangt, dass sich Input an eine solche Spezifikation zu halten habe.

      Im Glücksfall gehts mit Css:
      overflow:auto

      mfg Beat

      1. gudn tach!

        $str=~s/^(.{1,19}(?:$|.|[^.]+)).*/$1/;

        etwas leserlich

        gwohnheits-/geschmackssache.

        )             # da ist etwas falsch

        stimmt, der punkt wird u.u. mitabgeschnitten. oder meintest du was anderes?

        Das lässt sich aber leicht beheben.

        haettest ruhig angeben koennen, wie. ;-)

        $str=~s/^(.{1,19}(?:$|.|[^.]+.)).*/$1/;

        prost
        seth