Wörter und Zahlen nach speziellen Wörtern ausgeben

Diskutiere Wörter und Zahlen nach speziellen Wörtern ausgeben im Java Basics - Anfänger-Themen Bereich.
Bitte aktiviere JavaScript!
N

Noccctis

Guten Abend,

{"name": "Schal", "artnr": "1332", "preis":15}

Die grundlegende Idee war es aus solch aufgebauten Strings den Namen, die Artikelnummer und den Preis in verschieden Variablen abzuspeichern (Kann in unterschiedlicher Reihenfolge und mit unterschiedlich vielen Leerzeichen vorkommen).

Ich habe das ganze mit mehreren Tokenizern auf diesen Aufbau komprimiert:
name
Pullover
artnr1105
preis54

oder als String: namePulloverartnr1105preis54

Ich dachte das würde es vereinfachen, jedoch weiß ich leider immer noch nicht wie ich an die Kerninformation rankomme.

Also habt ihr eine Idee wie ich z.B. aus dem String : namePulloverartnr1105preis54 die Daten auslesen die ich benötige?
In dem Fall Pullover, 1105 und 54. Also jeweils nach name, artnr und preis. Es wäre einfacher wenn die Dinger immer die gleiche Position hätten
 
Robat

Robat

Warum nutzt du nicht einfach eine JSON Library um deinen String zu parsen? Dann kannst du ganz einfach über `obj.getString("name")` an deine verschiedenen Werte kommen.
 
MoxxiManagarm

MoxxiManagarm

Ich würde auch eine JSON Library verwenden. Ansonsten wäre es noch möglich sogenannte Look-Around Assertions (Regex) einzusetzen.
 
N

Noccctis

Ich darf leider kein JSON benutzen, da wir es noch nicht in der Vorlesung hatten. Ich habe jetzt eine Lösung gefunden, die aber eurer Meinung nach wahrscheinlich sehr unnötig und aufwendig ist, leider fiel mir nichts anderes ein.

Für alle anderen die vielleicht noch hier drauf kommen, hier meine Lösung:
Java:
    String m1 =  l.nextToken();
    String m2= l.nextToken();
    String m3 =l.nextToken();
    String m4 = l.nextToken();
    

   if(m1.equals("name")){
        name= m2;
        if(m3.substring(0,4).equals("artn")) {
            artnr=m3.substring(5,m3.length());
            preis=m4.substring(5,m4.length());
        }
        if(m3.substring(0,4).equals("prei")) {
            preis = m3.substring(5,m3.length());
            artnr=m4.substring(5,m4.length());;
            
        }
   }
  
    if(m1.substring(0,4).equals("artn")){
        artnr = m1;
        if(m2.substring(0,4).equals("prei")) {
            preis = m2.substring(5,m2.length());
            name = m4;
        }
        if(m2.equals("name")) {
            preis = m4.substring(5,m4.length());
            name=m3;
        }
   }
  
    if(m1.substring(0,4).equals("prei")){
        preis = m1;
        if(m2.substring(0,4).equals("artn")) {
            artnr = m2.substring(5,m2.length());
            name = m4;
        }
        if(m2.equals("name")) {
            artnr = m4.substring(5,m4.length());
            name=m3;
        }
   }
 
MoxxiManagarm

MoxxiManagarm

Oder du hättest dir doch mal die Look-Around Assertions angeschaut.

Java:
public static void main(String args[]) {
    String json = "{\"name\": \"Schal\",   \"artnr\": \"1332\", \"preis\":15}";

    System.out.println(findValue(json, "name"));
    System.out.println(findValue(json, "artnr"));
    System.out.println(findValue(json, "preis"));
}

public static String findValue(String json, String name) {
    Pattern p = Pattern.compile("(?<=\\\"" + name + "\\\":\\s*)\\\"?\\w+\\\"?"); \\ ohne escapes: (?<="name":\s*)"?\w+"?
    Matcher m = p.matcher(json);
    return m.find() ? m.group() : null;
}
prints:
Code:
"Schal"
"1332"
15
 
Robat

Robat

Man kann natürlich auch mit Splits arbeiten ..
Java:
    public static void main(String args[]) {
        java.util.Map<String, String> keyValuePairs = extractKeyValuePairs("{\"name\": \"Schal\", \"artnr\": \"1332\", \"preis\":15}");
        
      System.out.println(keyValuePairs.get("name"));
      System.out.println(keyValuePairs.get("artnr"));
    }
    
    private static java.util.Map<String, String> extractKeyValuePairs(final String json) {
        final java.util.Map<String, String> keyValuePairMap = new java.util.HashMap<>();
        final String data = json.substring(1, json.length()-1);
        for(String keyValuePair : data.split(",")) {
            String[] keyValuePairSplit = keyValuePair.split(":");
            if(keyValuePairSplit.length == 2) {
                keyValuePairMap.put(keyValuePairSplit[0].replaceAll("\"", "").trim(), keyValuePairSplit[1].replaceAll("\"", "").trim());
            }
        }
        return keyValuePairMap;
    }
 
N

Noccctis

Oder du hättest dir doch mal die Look-Around Assertions angeschaut.

Java:
public static void main(String args[]) {
    String json = "{\"name\": \"Schal\",   \"artnr\": \"1332\", \"preis\":15}";

    System.out.println(findValue(json, "name"));
    System.out.println(findValue(json, "artnr"));
    System.out.println(findValue(json, "preis"));
}

public static String findValue(String json, String name) {
    Pattern p = Pattern.compile("(?<=\\\"" + name + "\\\":\\s*)\\\"?\\w+\\\"?"); \\ ohne escapes: (?<="name":\s*)"?\w+"?
    Matcher m = p.matcher(json);
    return m.find() ? m.group() : null;
}
prints:
Code:
"Schal"
"1332"
15
Was genau muss ich alles importieren um json oder generell diesen Code so benutzen zu können?
 
N

Noccctis

Json ist nur eine Benennung in meinem Fall. Du brauchst dafür nur die 2 Klassen Pattern und Matcher. Look-Around Assertions sind nur Regex. Der reguläre Ausdruck geht auch noch besser, der hier ist quick&dirty, bringt aber das gewünschte Ergebnis.
Mir wird der Fehler:
java.util.regex.PatternSyntaxException: Look-behind group does not have an
obvious maximum length near index 15

ausgespuckt. Hab bei ("(?<=\\\"" + name + "\\\":\\s*)\\\"?\\w+\\\"?") das * bei s* entfernt, jedoch wird mir dann der dritte Wert (die 15) als null ausgegeben. Was mache ich falsch? Bei dir ging es doch
 
N

Noccctis

Java:
import java.util.Scanner;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class K2B01_Start {
    
  public static void main(String[] args) {
 
    Scanner sc = new Scanner(System.in);
    
    String json = "{\"name\": \"Schal\",   \"artnr\": \"1332\", \"preis\":15}";
    
    System.out.println(findValue(json, "name"));
    System.out.println(findValue(json, "artnr"));
    System.out.println(findValue(json, "preis"));
    


  }
 
 public static String findValue(String json, String name) {
    Pattern p = Pattern.compile("(?<=\\\"" + name + "\\\":\\s*)\\\"?\\w+\\\"?"); // ohne escapes: (?<="name":\s*)"?\w+"?
    Matcher m = p.matcher(json);
    return m.find() ? m.group() : null;
    }
}
 
MoxxiManagarm

MoxxiManagarm

Hmmm, ja es ging bei mir. Vielleicht reagieren
Verschiedene Java Versionen anders darauf. Du könntest aber z.b. statt * die {0, 10} probieren. Das sind zwar nicht unbestimmt viele Leerzeichen, aber einige.
 
Thema: 

Wörter und Zahlen nach speziellen Wörtern ausgeben

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben