Forum: PC-Programmierung JAVA: Strings filtern nur 0.9 und a.z bzw A.Z


von Steve_O (Gast)


Lesenswert?

Hallo, ich lese eine Datei zeilenweise in ein String ein. Im String sind 
dann auch Steuerzeichen und ?/ ...

Wie filtere ich die raus? Es sollen nur 0...9 sowie A...Z bzw a...z 
vorkommen dürfen.


Grüßle Steve_O

von Gast (Gast)


Lesenswert?

Zum Beispiel regulaere Ausdruecke benutzen, etwa java.util.regex aber 
gibt auch noch mehr mit regular expressions.

von Bobby (Gast)


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;
}

von mandrake (Gast)


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
}

von Kai G. (runtimeterror)


Lesenswert?

>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.

von Markus V. (valvestino)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.