JAVA: Strings filtern nur 0.9 und a.z bzw A.Z

Gast #787219
Lesenswert?

Ich kann kein Java.

Vielleicht hilft Dir folgendes an C angelehnte Codebeispiel


bool Filtere_Zeichen (char x)
{
  if (x >= '0') and (x <= '9') then return true;
  if (x >= 'A') and (x <= 'Z') then return true;
  if (x >= 'a') and (x <= 'z') then return true;

  return false;
}
Gast #789585
Lesenswert?

Die Klasse die du brauchst heißt FilterReader.
Du erzeugst eine neue Klasse und vererbst alle Eigenschaften von 
FilterReader.
Dann überschreibst du die Methode "read".
1
/*Anlegen des Readers. LineFeedFilter löscht Zeilenumbrüche in Spalten.*/
2
        BufR = new BufferedReader(new LineFeedFilter(new FileReader(Dateiname)));

Ich habe mal einen Filter gebraucht, der mir Linefeeds herausfiltert 
wenn keine Carriage Return davor kommt.

Hier ist er:
1
public class LineFeedFilter extends FilterReader
2
{
3
    private int iLastSymbol=0;
4

5

6
    /**
7
     * Konstruktor ruft den Konstruktor der Vaterklasse auf
8
     * @param in Datenstrom vom Typ Reader
9
     */
10
    public LineFeedFilter(Reader in)
11
    {
12
        super(in);
13
    }
14

15
    /**
16
     * Liest ein einziges Zeichen aus dem Datenstrom und filtert Linefeeds dann heraus,
17
     * wenn das Zeichen davor kein Carriage Return war
18
     * @return gibt den ASCII-Code als int zurück
19
     */
20
    public int read() throws IOException
21
    {
22
        /*Symbol lesen: */
23
        int iSymbol = in.read();
24
        /*Wenn das gelesene Symbol ein LineFeed ist:*/
25
        if (iSymbol == 10)
26
        {
27
            /*Wenn das letzte Symbol ein Carriage Return war:*/
28
            if (iLastSymbol == 13)
29
            {
30
                /*Gebe das Linefeed zurück*/
31
                iLastSymbol = iSymbol;
32
                return iSymbol;
33
            }
34
            else
35
            {
36
                /*Gebe nichts zurück*/
37
                iLastSymbol = iSymbol;
38
                return ' ';
39
            }
40
        }
41
        else
42
        {
43
            /*Gib das gelesene Zeichen zurück*/
44
            iLastSymbol = iSymbol;
45
            return iSymbol;
46
        }
47
    }
48

49
    /**
50
     * Liest len Zeichen in den Puffer beginnend bei Zeichen off
51
     */
52
    public int read(char[] cbuf, int off, int len) throws IOException
53
    {
54
        /*off Zeichen auslassen:*/
55
        this.skip(off);
56
        /*Lesen der len Zeichen in den Puffer:*/
57
        for (int i=0; i < len; i++)
58
        {
59
            int iCh = this.read();
60
            if (iCh == -1)
61
            {
62
                if (i==0) return -1;
63
                else return i;
64
            }
65
            else
66
            {
67
                cbuf[i] = (char) iCh;
68
            }
69
        }
70
        return len;
71
    }
72
}
#790232
Lesenswert?

Kai Giebeler wrote:
>>Die Klasse die du brauchst heißt FilterReader.
> Ist das nicht etwas oversized?
>
> Ich tendiere auch zu den regulären Ausdrücken: /[0-9a-zA-Z]+/ sollte
> seinen Zweck erfüllen.
>
> Es sei denn du brauchst noch mehr Infos aus der Quelldatei.

Nö, das ist nicht oversized sondern elegant.

In Java ist das genau die Vorgehensweise, wie sie die Designer der 
Stream-Klassen vorgesehen haben.

Einen kleinen Haken habe ich an Mandrakes Beispiel allerdings gefunden. 
Er implementiert die Methode read(char[] buf,...) anders, als die 
Super-Klasse FilterReader. Der Parameter "ofs" wird als Offset im Stream 
verwendet. Er ist jedoch laut API-Doc der Offset im char-Array, ab dem 
die gelesenen Daten gespeichert werden.

Daher dürfte für Steve_O die Neuimplementierung der Methode nicht 
erforderlich sein.

Gruß
Markus

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren