String auseinander nehmen in verschiedene Teile

beta20

Top Contributor
Hallo zusammen,

ich möchte gerne einen String auseinander nehmen und die verschiedenen Dinge dann wiederum in einen String etc. speichern:

Mein String:
s = "[%Kunde.Vorname%] = 'Anton' OR [%Kunde.Vorname%] = 'Mike' "

Folgende Dinge benötige ich:
String s1 ="[%Kunde.Vorname%]";
String s2 = "=";
String s3 = "'Anton'";

String s4 = "OR";

String s1 ="[%Kunde.Vorname%]";
String s2 = "=";
String s3 = "'Mike'";

Das ganze könnte ich dann in eine neue Klasse ablegen mit:
String sFieldName = s1
String sOperator = s2
String sResult = s3
String sNextOperator = s4

sNextOperator -> kann dann natürlich leer sein...

Gibt es hier eine Logik und hat jemand eine Idee, wie man das gescheit trennen kann? Die Operator können sich natürlich unterscheiden (-, +, /, *, .....)




 
Um an die verschiedenen Teilstrings zu kommen kannst du ganz einfach den String am Leerzeichen splitten - Gesetz dem Fall, dass 'Name' keine Leerzeichen enthält
 
Dann könntest du es vielleicht mit einem Regulären Ausdruck versuchen .. ist aber sicherlich nicht die schönste Variante
Java:
    String s = "[%Kunde.Vorname%] = 'Anton Paul' OR [%Kunde.Vorname%] = 'Mike' ";
    Pattern pattern = Pattern.compile("(\\[%\\w+\\.\\w+%\\]) ([=|-|\\+|\\*]) ('[^']*') (OR)?");
    Matcher matcher = pattern.matcher(s);

    while(matcher.find()) {
      System.out.println("Fieldname: " + matcher.group(1));
      System.out.println("Operator: " + matcher.group(2));
      System.out.println("Result: " + matcher.group(3));
      System.out.println("NextOperator: " + matcher.group(4));

      System.out.println();
    }

(\\[%\\w+\\.\\w+%\\]) 1. Gruppe für den Feldnamen
([=|-|\\+|\\*]) 2. Gruppe für den Operator (lässt sich natürlich nach belieben erweitern
('[^']*') 3. Gruppe für das Ergebnis
(OR)? 4. Gruppe für den optionalen nächsten Operator

PS: Ist nicht perfekt und soll nur als Anreiz dienen
 
Bitte nicht Regex für sowas nehmen. Dafür gibt es ordentliche Parser! Ich hab dir doch schon gesagt, dass man dafür ANTLr oder CoCo/R nimmt.
 
Dafür gibt es ordentliche Parser!
So ist es.

Trotzdem mal ein Ansatz, wie so etwas aussehen könnte:
Java:
package org.java_forum.mihe7;

public class Token {
    public static enum Type { FIELD, LITERAL, OP };

    public final Type type;
    public final String content;

    Token(Type type, String content) {
        this.type = type;
        this.content = content;
    }

    @Override
    public String toString() {
        return "Token[" + type + ", " + content + "]";
    }
}

Java:
package org.java_forum.mihe7;

import java.io.Reader;
import java.io.IOException;
import java.util.Iterator;
import java.util.NoSuchElementException;

import static org.java_forum.mihe7.Token.Type.*;

public class Tokenizer implements Iterator<Token> {
    private final Reader reader;
    private Token current;

    public Tokenizer(Reader reader) {
        this.reader = reader;
    }

    public boolean hasNext() {
        try {
            readToken();
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }

        return current != null;
    }

    public Token next() {
        if (!hasNext()) {
            throw new NoSuchElementException();
        }
        Token result = current;
        current = null;
        return result;
    }

    private void readToken() throws IOException {
        if (current != null) {
            return;
        }

        int ch;
        int state = 0;
        StringBuilder content = new StringBuilder();
        while (current == null && (ch = reader.read()) != -1) {
            char c = (char) ch;
            switch (state) {
                case 0:
                    if (!Character.isWhitespace(c)) {
                        if (c == '[') {
                            state = 1;
                        } else if (c == '\'') {
                            state = 2;
                        } else {
                            state = 3;
                            content.append(c);
                        }
                    }
                    break;
                case 1:
                    if (c == ']') {
                        current = new Token(FIELD, content.toString());
                    } else {
                        content.append(c);
                    }
                    break;
                case 2:
                    if (c == '\'') {
                        current = new Token(LITERAL, content.toString());
                    } else {
                        content.append(c);
                    }
                    break;
                case 3:
                    if (Character.isWhitespace(c)) {
                        current = new Token(OP, content.toString());
                    } else {
                        content.append(c);
                    }
                    break;
                default:
                    throw new IllegalStateException();
            }
        }
    }
}

Zum Testen:
Java:
package org.java_forum.mihe7;

import java.io.StringReader;

public class TokenizerTest {
    public static void main(String[] args) {
        StringReader reader = new StringReader("[%Kunde.Vorname%] = 'Anton' OR [%Kunde.Vorname%] = 'Mike'");
        Tokenizer t = new Tokenizer(reader);
        while (t.hasNext()) {
            System.out.println(t.next());
        }
    }
}

Ausgabe:
Code:
Token[FIELD, %Kunde.Vorname%]
Token[OP, =]
Token[LITERAL, Anton]
Token[OP, OR]
Token[FIELD, %Kunde.Vorname%]
Token[OP, =]
Token[LITERAL, Mike]

Aber im Ernst: nimm was vernünftiges.
 
Lol. Nein, ich bin arbeitsuchend und beschäftige mich nebenbei ein bisschen mit der Programmierung. Die Geschichte geht so: Ich will ein Spiel in der Art von "Nexus - The Jupiter Incident" entwickeln. Dafür lege ich gerade die (grafischen) Grundlagen mit einem Lehrbuch und der uralten Genesis-3D-Engine. Die dort abgedruckten Codes liegen dem Buch auf CD bei, aber die sind total schlecht formatiert. Da ich die Codes evtl. in einem eigenen Programmier-Lehrgang verwenden will - es handelt sich um C++-Codes - will ich diese mit einem Java-Tool ordentlich (und mit meiner Note) formatieren. Dies will mir aber mangels Parser nicht so recht gelingen. Ich probiere es derzeit immer noch mit einer selbstprogrammierten Zeichenverarbeitung, d.h. ohne Parser, weil ich den Aufwand der Einarbeitung - nur für dieses kleine Tool - etwas scheue.

So, jetzt kennst du die ganze Geschichte. 😀
 

Zurück
Oben