Thorsten Steffen: Regulärer Ausdruck

Hi,
ich möchte in nem perl-script einen kleingeschriebenen Begriff in einer Variable ändern, und zwar soll

  • der erste Buchstabe groß geschrieben werden
  • ae durch ä
  • oe durch ö
  • ue durch ü
  • ss durch ß
    ersetzt werden.
    Gibts dafür nen regulären Ausdruck ?

Danke
Thorsten

  1. Hallo Thorsten,

    mit einem einzigen Befehl wirst du das wohl nicht alles erschlagen. Aber probiers mal so - die folgenden Befehle nehmen an, dass deine Zeichenkette in einer Variablen namens $Zeichenkette gespeichert sind:

    • der erste Buchstabe groß geschrieben werden

    $Zeichenkette = ucfirst($Zeichenkette);

    • ae durch ä

    $Zeichenkette =~ s/ae/ä/g;

    • oe durch ö

    $Zeichenkette =~ s/oe/ö/g;

    • ue durch ü

    $Zeichenkette =~ s/ue/ü/g;

    • ss durch ß

    $Zeichenkette =~ s/ss/ß/g;

    viele Gruesse
      Stefan Muenz

  2. Hi,

    • ae durch ä
    • oe durch ö
    • ue durch ü
    • ss durch ß

    Megärlebnis, Autöinstellplatz, Fraünquote, Außtellung. Ich hoffe Du weißt, was Du tust ;-)

    Gibts dafür nen regulären Ausdruck ?

    Ungetestet:

    my %ersetzungen = {'ae'=>'ä', 'oe'=>'ö', 'ue'=>'ü', 'ss'=>'ß'};

    Variante 1; flexibel, aber langsam:

    foreach (keys %ersetzungen) {
      $string =~ s/$_/$ersetzungen{$_}/g;
    }

    Variante 2; unflexibel, aber schnell:

    $string =~ s/([aou]ess)/$ersetzungen{$1}/g;

    ucfirst($string) sollte _danach_ eingesetzt werden, unter Verwendung von

    perldoc perllocale

    Cheatah

    1. hi!

      my %ersetzungen = {'ae'=>'ä', 'oe'=>'ö', 'ue'=>'ü', 'ss'=>'ß'};
      $string =~ s/([aou]ess)/$ersetzungen{$1}/g;

      Hm, das sieht lustig aus. An sowas hab ich auch noch nie gedacht ;))

      Schade, dass "a" und "ä" nicht ganz so weit auseinander sind, wie "o/ö" und "u/ü". Deshalb funktioniert
      folgender Ausdruck nur mit "oe", "ue", "Oe" und "Ue" (keine Garantie, dass das überall und auf jeder
      Plattform läuft):
        $text =~ s/([ouOU])e/chr(ord($1)+135)/eg;

      Naja, man kann das natürlich etwas erweitern, damit es auch mit "ae" und "Ae" funktioniert:
        $text =~ s([aAoOuU])echr(ord($1)+135-4+(int(ord(lc$1)/(ord((ord(lc$1)>ord("U"))?"a":"A")+1))*4))eg;

      Leider fällt mir für die Umwandlung von "ss" in "ß" keine Möglichkeit mehr ein, das zu erweitern. Aber inkl.
      Vergrößerung des ersten Buchstabens, kann man das ganze - ohne Garantie - so zusammenfassen:
        use locale;
        $text =~ s([aAoOuU])eucfirst chr(ord($1)+135-4+(int(ord(lc$1)/(ord((ord(lc$1)>ord("U"))?"a":"A")+1))*4))eg;

      bye, Frank!

      ps: Bitte diesen Beitrag nicht allzu ernst nehmen :)

      1. hi!

        use locale;
          $text =~ s([aAoOuU])eucfirst chr(ord($1)+135-4+(int(ord(lc$1)/(ord((ord(lc$1)>ord("U"))?"a":"A")+1))*4))eg;

        Ups, da hab ich wohl einen Denkfehler begangen. Das funktioniert natürlich so nicht. Wenn aber einer
        trotzdem eine Lösung hat, darf er sie gerne posten ;)

        bye, Frank!