• Wir präsentieren Dir heute ein Stellenangebot für einen Java Entwickler - m/w/d in Augsburg, München, Stuttgart oder Bamberg. Hier geht es zur Jobanzeige

Best Practice Tabulatoren verschiedener Länge ersetzen

W

wersi77

Aktives Mitglied
Hallo zusammen,

leider stehe ich vor der Herausforderung, dass ich in einem mehrzeiligen String-Text die Tabulatoren entfernen muss und durch Blanks gleicher Länge zu ersetzen.
Hierbei handelt es sich um eine Tabelle, welche teilweise mit Tabulatoren aufgebaut wurde. z.B.

Java:
spalte1 | spalte2345 | spalteletzt
----------------------------------
        | aaaaaaaaa  | bbbbbbbbbb
        | cccccccc   | dddddddddd

Zunächst hatte ich überlegt folgendermaßen vorzugehen

Java:
text.replaceAll("\t","    ")

Aber leider sind manche Tabulatoren aber kürzer als 4 Blanks. Daher benötige ich eine Möglichkeit die unterschiedlichen Tab Längen zu identifizieren und jeweils durch die korrekte Anzahl Blanks zu ersetzen.
Wer kann mir hier helfen? Vielen Dank für Eure Hilfe im Vorraus.
 
kneitzel

kneitzel

Top Contributor
Ich denke, dass Du da Zeilenweise vorgehen musst. Immer wenn ein Tabulator kommt, musst Du die bereits gesetzten Zeichen nehmen und dann rechnen:
zeichen % n gibt an, wie viele Zeichen vom "n Zeichen breiten Tabulator" bereits gesetzt sind.
Also ist der aktuelle Tabulator nur noch n - zeichen%n lang.
 
W

wersi77

Aktives Mitglied
Ich hatte es befürchtet. Gibt es also keinen Regex, welcher eine explizite Tab Länge identifiziert?
 
L

LimDul

Top Contributor
Dürfte schwer werden. Ein Tabulator hat keine "Länge" sondern ist ja nur ein Sonderzeichen. Die Länge ist eine reine Interpretation verschiedener Programme, dass ein Tab nicht 4 Blanks entsprichts, sondern auf die nächste, durch 4 teilbare Spaltenposition geht.

Das heißt, für einen RegEx benötigst du damit die Zahl der vorhergehenden Zeichen bzw. ob es genauer: abzüglich voller 4er Blöcke an Zeichen, wie viele Zeichen sind noch da. Das sind Kontext-Informationen, die in einem RegEx erst mal schwierig sind. Evtl geht so was:

Code:
(....)*\t => Durch 4 ersetzen
(....)*.\t => Durch 3 ersetzen
(....)*..\t => Durch 2 ersetzen
(....)*...\t => Durch 1 ersetzen
 
W

wersi77

Aktives Mitglied
Ich denke, es wird also auf einen zeilenweise Scan hinauslaufen...
Vielen Dank schonmal für die Antworten.
 
W

wersi77

Aktives Mitglied
Für alle, die es interessiert.
Damit sollte es gehen:
Java:
    private String replaceTabs(String text) {
        String newText="";
        String[] lines = text.split("\n");
        for (String line : lines) {
            String newLine=line;
            while (newLine.contains("\t")) {
                int offset = 0;
                int strLen = newLine.length();
                while (offset < strLen) {
                  int curChar = newLine.codePointAt(offset);
                  if (curChar==9) {
                      if (offset%4 == 3) {
                          newLine=newLine.substring(0,offset)+ " " + newLine.substring(offset+1);                         
                      } else if (offset%4 == 2) {
                          newLine=newLine.substring(0,offset)+ "  " + newLine.substring(offset+1);
                      } else if (offset%4 == 1) {
                          newLine=newLine.substring(0,offset)+ "   " + newLine.substring(offset+1);
                      } else {
                          newLine=newLine.substring(0,offset)+ "    " + newLine.substring(offset+1);
                      }
                      break;
                  }
                  offset += Character.charCount(curChar);                 
                }
            }
            newText+=newLine +"\n";
        }
        return newText;
    }
 
mihe7

mihe7

Top Contributor
Das geht allgemeiner und effizienter:

Java:
String expandMultilineTabs(String text, int tabSize) {
    StringJoiner expanded = new StringJoiner("\n");
    String[] lines = text.split("\n");
    for (String line : lines) {
        expanded.add(expandTabs(line, tabSize));
    }
    return expanded.toString();
}

String expandTabs(String line, int tabSize) {
    StringBuilder expanded = new StringBuilder();
    int expansion = 0;
    int oldPos = 0;
    int pos;
    while ((pos = line.indexOf("\t",  oldPos)) != -1) {
        int expandedPos = pos + expansion;
        int remaining = tabSize - expandedPos % tabSize;
        expansion += remaining - 1; // -1, da Tab ersetzt wird.
        String spaces = " ".repeat(remaining); // vor Java 11, z. B. = new String(new char[remaining]).replace("\0", " ");
        expanded.append(line.substring(oldPos, pos)).append(spaces);
        oldPos = pos + 1;
    }
    expanded.append(line.substring(oldPos));
    return expanded.toString();
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Problem mit Tabulatoren bei Zeilen zählen einer Textdatei Java Basics - Anfänger-Themen 17
B Tabulatoren entfernen Java Basics - Anfänger-Themen 2
S Array erzeugen mit verschiedener Verteilung Java Basics - Anfänger-Themen 11
H Anzahl verschiedener Buchstaben im String Java Basics - Anfänger-Themen 41
F Interaktion von Objekten verschiedener Klassen... Java Basics - Anfänger-Themen 13
D Liste verschiedener konkreter Klassen möglich? Java Basics - Anfänger-Themen 2
P Liste sortieren verschiedener generischer Typen Java Basics - Anfänger-Themen 4
E Array Anzahl verschiedener Werte ausgeben Java Basics - Anfänger-Themen 3
P Windows vs. Ubuntu verschiedener Output Java Basics - Anfänger-Themen 31
L Vererbung - Wie Objekte verschiedener Klassen unterscheiden Java Basics - Anfänger-Themen 3
J OOP Ausgabe verschiedener Variabeln aus verschiedenen Subclasses Java Basics - Anfänger-Themen 2
B EreignisListener verschiedener Klassen aus einer Ereignisklasse verwalten Java Basics - Anfänger-Themen 9
N Folge verschiedener Nährwerte zur Kubikwurzel Java Basics - Anfänger-Themen 15
4 OOP Problem beim Speichern verschiedener Klassen in verschiedenen Dateien Java Basics - Anfänger-Themen 25
T Collection von Objekten verschiedener Klassen Java Basics - Anfänger-Themen 4
G Listenartige Speicherung verschiedener Objekte Java Basics - Anfänger-Themen 5
T Rückgabewerte verschiedener Typen Java Basics - Anfänger-Themen 3
N Vergleich zweier Elemente verschiedener Vectoren Java Basics - Anfänger-Themen 2
S Zugriffsdeklinationen verschiedener Klassen? Java Basics - Anfänger-Themen 3
V Threads verschiedener Klassen synchronisieren Java Basics - Anfänger-Themen 5
G Installation verschiedener JREs Java Basics - Anfänger-Themen 3
W Berechnung verschiedener Eigenschaften von Geraden Java Basics - Anfänger-Themen 4
H Klassen Die Länge einer Text-Node bestimmen Java Basics - Anfänger-Themen 2
J Objekt-Array dynamischer Länge aus Benutzereingaben erstellen Java Basics - Anfänger-Themen 6
G Variablen Array Länge über den Konstruktor definieren Java Basics - Anfänger-Themen 4
M Strings mit gerader und ungerader Länge ausgeben Java Basics - Anfänger-Themen 10
N Länge eines Arrays in einem Objekt testen Java Basics - Anfänger-Themen 51
L Zwei sortierte Subarrays mit gleicher Länge zusammenfügen Java Basics - Anfänger-Themen 2
A Arrays kombinieren (länge eines Arrays kann 0 sein) Java Basics - Anfänger-Themen 6
S Java Array Länge aus anderer Klasse lesen Java Basics - Anfänger-Themen 1
O Länge eines Arrays Java Basics - Anfänger-Themen 6
M Die länge von char Java Basics - Anfänger-Themen 6
A Best Practice Undefinierte länge bei arrays Java Basics - Anfänger-Themen 4
E Array-list mit einer bestimmten Länge Java Basics - Anfänger-Themen 17
F Maximale Länge eines Strings Java Basics - Anfänger-Themen 5
L Länge der dritten Dimension eines dreidimensionalen Arraya Java Basics - Anfänger-Themen 1
T Länge einer Textdatei Java Basics - Anfänger-Themen 11
C Array - Länge dynamisch übergeben Java Basics - Anfänger-Themen 7
N Array mit unbestimmter länge Java Basics - Anfänger-Themen 12
T String länge messen in mm Java Basics - Anfänger-Themen 1
M Generierter Tannenbaum - String Länge Java Basics - Anfänger-Themen 1
T String/int länge Java Basics - Anfänger-Themen 2
I Länge von mehrdimensionalen Array Java Basics - Anfänger-Themen 5
A Länge Substring Java Basics - Anfänger-Themen 1
D Zweidimensionales Array (Länge) Java Basics - Anfänger-Themen 2
S Listnode Länge Java Basics - Anfänger-Themen 2
shiroX Input/Output Array erstellen / Länge Java Basics - Anfänger-Themen 3
Z Erste Schritte Einlesen der Länge eines Feldes Java Basics - Anfänger-Themen 25
G Erste Schritte berechne länge von einträgen Java Basics - Anfänger-Themen 5
S Länge einer Zahl Java Basics - Anfänger-Themen 18
C Datentypen Array-Einträge überhalb der Array-Länge - welcher Wert? Java Basics - Anfänger-Themen 5
M Strings mit variabler Länge auffüllen Java Basics - Anfänger-Themen 6
J Alle Wörter der Länge n mit 0 und 1 Java Basics - Anfänger-Themen 17
S Länge eines Elements im String Array Java Basics - Anfänger-Themen 5
C Datentypen Array mit dynamischer Länge? Java Basics - Anfänger-Themen 14
M Länge der Strecke zwischen zwei Punkten Java Basics - Anfänger-Themen 10
P länge von array abfragen? Java Basics - Anfänger-Themen 2
D Erste Schritte Warum wird bei einem Array die Länge über Length ausgegeben? Java Basics - Anfänger-Themen 6
S Länge eines zweidimensionalen Feldes Java Basics - Anfänger-Themen 3
M Länge String Java Basics - Anfänger-Themen 3
A Länge einer Hexadezimalzahl in Bits Java Basics - Anfänger-Themen 40
P String- Länge Java Basics - Anfänger-Themen 3
A Klassen Eigene Datenklasse - Strings mit fixer Länge Java Basics - Anfänger-Themen 2
E Länge eines spez. Arrays Java Basics - Anfänger-Themen 10
E Länge eines Feldes ausgeben Java Basics - Anfänger-Themen 13
Gossi Datentypen Länge von Zahlentypen Java Basics - Anfänger-Themen 3
V Warten bis die Länge eines Strings nicht mehr 0 ist Java Basics - Anfänger-Themen 13
G Array mit zufälliger Länge Java Basics - Anfänger-Themen 4
D prüfen ob länge eines Arrays == 0 Java Basics - Anfänger-Themen 4
S Datentypen String mit fester Länge (Rückgabewert einer Methode) Java Basics - Anfänger-Themen 2
D Array anlegen ohne bekannte Länge? Java Basics - Anfänger-Themen 6
B Maximale Länge eines integer Arrays ? Java Basics - Anfänger-Themen 31
J Länge eines long wertes Java Basics - Anfänger-Themen 13
S ArrayList länge lässt sich nicht voreinstellen Java Basics - Anfänger-Themen 10
F String begrenzte Länge??? Java Basics - Anfänger-Themen 16
N List länge Java Basics - Anfänger-Themen 6
DStrohma Binärwörter der Länge n ausgeben Java Basics - Anfänger-Themen 3
G Länge eines Integers ermitteln? Java Basics - Anfänger-Themen 38
A array und seine länge Java Basics - Anfänger-Themen 5
G länge von string, string aus integer/char Java Basics - Anfänger-Themen 6
G Länge einer Enumeration feststellen Java Basics - Anfänger-Themen 15
T Länge von Strings im Array vergleichen Java Basics - Anfänger-Themen 2
N Array bei unbekannter Länge Java Basics - Anfänger-Themen 4
M unerklärbarer Fehler bei Array-Länge Java Basics - Anfänger-Themen 4
R Frage zur Länge von Textfeld und String Java Basics - Anfänger-Themen 4
G Warum hat char die Länge 2? Java Basics - Anfänger-Themen 9
G Länge eines Array trimmen oder dynamisch verändern. Java Basics - Anfänger-Themen 3
B JTable - Einstellen der Größe bzw. der Länge Java Basics - Anfänger-Themen 1
J Char-Array mit variabler Länge zurückliefern. Java Basics - Anfänger-Themen 11
G Keine feste Länge bei Objekten, warum nur Zeiger? Java Basics - Anfänger-Themen 8
F ArrayList Länge ermitteln und ausgeben Java Basics - Anfänger-Themen 13
M länge von wörtern betimmen Java Basics - Anfänger-Themen 20
NightmareVirus Länge einer Integerzahl bestimmt Java Basics - Anfänger-Themen 6
B 2D Punkte erstellen und ihre Länge berechnen/Problem this. Java Basics - Anfänger-Themen 3
L String konstante Länge? Java Basics - Anfänger-Themen 4
R maximale Länge des INHALTS im JTextField Java Basics - Anfänger-Themen 2
R String[][] mit variabler länge Java Basics - Anfänger-Themen 4
G länge einer audiodatei herausfinden Java Basics - Anfänger-Themen 3
B Länge eines Char-Arrays bestimmen Java Basics - Anfänger-Themen 7
M Maximale String länge finden? Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Anzeige

Neue Themen


Oben