letsregex: Zeilen auffüllen mit Regex

Hallo,

gibt es eine Möglichkeit, eine Zeile bzw. einen String auf eine bestimmte Länge aufzufüllen (mit Fillerzeichen) nur mit Regex unabhängig von der Programmiersprache?

Ich will z.B. aus (die "" umschließen nur den String):
"ABCDE"
ein
"ABCDE#####" (auf 10 Zeichen aufgefüllt)

oder aus
"123"
ein
"123#######" (auch auf 10 Zeichen aufgefüllt)

Ist das nur mittels Regexl möglich und wenn ja, wie geht das?

  1. Om nah hoo pez nyeetz, letsregex!

    Ist das nur mittels Regexl möglich und wenn ja, wie geht das?

    Reguläre Ausdrücke sind keine Zuweisungsoperatoren. Sie dienen lediglich zur Prüfung, ob eine Zeichenkette bestimmten Mustern genügt.

    Da du dich nicht zur Programmiersprache geäußert hast, ein ungetestetes JavaScript-Beispiel.

    function string_auffüllen (string, filler, length) {  
      
      if (string.length < length) {          // Auffüllen nötig  
        for (var i = string.length; i < length; i++) {  
          string += filler;  
        }  
      }  
      return string;  
    }
    

    Matthias

    --
    Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Blatt und Blattern.

    1. Om nah hoo pez nyeetz, letsregex!

      Ist das nur mittels Regexl möglich und wenn ja, wie geht das?

      Reguläre Ausdrücke sind keine Zuweisungsoperatoren. Sie dienen lediglich zur Prüfung, ob eine Zeichenkette bestimmten Mustern genügt.

      In der Regel bieten Programmiersprachen aber auch die Möglichkeit, Zeichen zu ersetzen. Dass ich keine Programmiersprache genannt habe, liegt daran, dass die Ersetzung unabhängig von der Programmiersprache gemacht werden soll. (auch wenn die Regex-Implementierung teilweise selbst abhängig von der Sprache sind, aber naja)
      MudGuard hat ja schon eine Lösung genannt. Die ist so einfach, ich wundere mich, dass ich nicht selbst darauf gekommen bin. Was ich mich jetzt nur noch frage ist, ob das vielleicht auch mit einem einzigen Regex gesteht statt 2 Stück hintereinander.

      Trotzdem danke euch beiden schonmal! =)

      1. gudn tach!

        Dass ich keine Programmiersprache genannt habe, liegt daran, dass die Ersetzung unabhängig von der Programmiersprache gemacht werden soll. (auch wenn die Regex-Implementierung teilweise selbst abhängig von der Sprache sind, aber naja)

        da in allen sprachen, die regexp koennen, vermutlich auch for-schleifen existieren und die laenge eines strings oder ein teilstring leicht eruiert werden kann, sollte ebenfalls halbwegs sprachenunabhaengig (hier jetzt in perl-syntax), aber halt nicht mehr regexp-only das gehen, was Matthias vorschlug:

        je nach vorgabe, ob in-place:

          
        $numPadChar = 10 - length $str;  
        $str .= '#' for 1..$numPadChar;  
        
        

        oder (ueber substrings)

          
        $str .= substr($str.'##########', 0, 10);  
        
        

        oder nicht-in-place:

          
        $new_str = $str;  
        $new_str .= '#' for 1..(10 - length $str);  
        
        

        (speziell in perl wuerde ich es das problem noch mal anders loesen:

          
        $str .= '#' x (10 - length $str);  
        
        ~~~)  
          
        
        > MudGuard hat ja schon eine Lösung genannt. Die ist so einfach, ich wundere mich, dass ich nicht selbst darauf gekommen bin.  
          
        vermutlich, weil du es in \_einem\_ ausdruck loesen wolltest.  
          
        
        > Was ich mich jetzt nur noch frage ist, ob das vielleicht auch mit einem einzigen Regex gesteht statt 2 Stück hintereinander.  
          
        ich vermute, dass das nur gemogelt geht, z.b. so:  
        ~~~perl
          
        s/^(.*)\K$/'#' x (10 - length $1)/e;  
        
        

        oder wie oben per substrings:

          
        s/^(.*)\K$/substring('###########', 0, 10 - length $1)/e;  
        
        

        prost
        seth

        1. gudn tach!

          $str .= substr($str.'##########', 0, 10);

            
          aeh, natuerlich nicht anhaengen, sondern frisch zuweisen:  
            
          ~~~perl
            
          $str = substr($str.'##########', 0, 10);  
          
          

          mit anhaengen waers wie im anderen beispiel angegeben:

            
          $str .= substr('##########', 0, 10 - length $str);  
          
          

          letzteres ist evtl. wegen weniger string-rumkopiererei schneller.

          prost
          seth

        2. Om nah hoo pez nyeetz, seth_not@home!

          In PHP kann man dafür printf nehmen.

          $string = "Hallo";  
          printf("%'#-10s", $string);
          

          ergibt

          Hallo#####  
          
          

          Fürs Archiv:

          %  - leitet die Variablenausgabe ein
          '  - gibt an, dass das Auffüllzeichen nicht das Leerzeichen ist
          #  - das Auffüllzeichen
          -  - linksbündige Ausrichtung
          10 - mindestens 10 Zeichen
          s  - das Ergebnis ist ein String

          Matthias

          --
          Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Staub und Staubecken.

          1. gudn tach!

            In PHP kann man dafür printf nehmen.

            $string = "Hallo";

            printf("%'#-10s", $string);

            
            > [...]  
            > '  - gibt an, dass das Auffüllzeichen nicht das Leerzeichen ist  
              
            oh, wow, das ist mal ein cooles kleines feature von php, dass es so nicht in perl gibt (oder zumindest mir nicht bekannt ist).  
              
            prost  
            seth
            
  2. Hi,

    gibt es eine Möglichkeit, eine Zeile bzw. einen String auf eine bestimmte Länge aufzufüllen (mit Fillerzeichen) nur mit Regex unabhängig von der Programmiersprache?

    s/$/##########/
    s/^(.{10}).*/\1/

    (wobei das beides auch ohne Regex geht - n Füllzeichen anhängen, dann auf n Zeichen abschneiden)

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  3. @@letsregex:

    nuqneH

    gibt es eine Möglichkeit, eine Zeile bzw. einen String auf eine bestimmte Länge aufzufüllen (mit Fillerzeichen) nur mit Regex unabhängig von der Programmiersprache?

    Wenn du keine Muster suchst, warum willst du dann reguläre Ausdrücke einsetzen?

    Was ist überhaupt der Anwendungsfall, eine Zeichenkette mit Füllzeichen auf eine feste Länge zu bringen?

    Qapla'

    --
    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)