Zeilen auffüllen mit Regex
letsregex
- sonstiges
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?
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
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! =)
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
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
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
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
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
@@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'