Vengo da un fondo C (originariamente ormalmente ormiglina, anche se non ho usato quella lingua per quasi 5 anni) e sto cercando di analizzare alcuni valori di una catena in Java. In c userei SScanf. A Java, la gente mi ha detto “Usa scanner o StringTokenizer”, ma non riesco a vedere come usarli per ottenere il mio scopo.
La mia catena di ingresso sembra “17-mar-11 15.5.25.000000000” . In c, farebbe qualcosa come:
sscanf(thestring, "%d-%s-%d %d.%d.%d.%d", day, month, year, hour, min, sec, fracpart);
ma in Java, tutto quello che posso fare è che cose come:
scanner.nextInt();
Questo non mi consente di verificare il modello, e per “mare” finisco dover fare cose come:
str.substring(3,6);
Orribile! Sicuramente c’è un modo migliore?
Risposte
37 per la risposta № 1
Il problema è che Java non ha parametri (o pass per riferimento) come C o C #.
Ma c’è un modo migliore (e più solido). Utilizzare espressioni regolari:
Naturalmente, il codice C è più conciso, ma la ruba tecnica ha un vantaggio: i modelli specificano un formato più preciso rispetto a “% s” E “% d”. Pertanto, è possibile utilizzare D {2} per specificare che quel giorno deve essere composto esattamente da 2 cifre.
21 per la risposta № 2
Ecco una soluzione con scanner:
Scanner scanner = new Scanner("17-MAR-11 15.52.25.000000000");Scanner dayScanner = new Scanner(scanner.next());Scanner timeScanner = new Scanner(scanner.next());dayScanner.useDelimiter("-");System.out.println("day=" + dayScanner.nextInt());System.out.println("month=" + dayScanner.next());System.out.println("year=" + dayScanner.nextInt());timeScanner.useDelimiter("\.");System.out.println("hour=" + timeScanner.nextInt());System.out.println("min=" + timeScanner.nextInt());System.out.println("sec=" + timeScanner.nextInt());System.out.println("fracpart=" + timeScanner.nextInt());
8 per la risposta № 3
Nessuno di questi esempi è stato davvero soddisfacente per me, quindi ho fatto la mia utilità Java Sscanf:
https://github.com/driedler/java-sscanf/tree/master/src/util/sscanf
Ecco un esempio di analisi di una stringa esadecimale:
String buffer = "my hex string: DEADBEEFn"Object output = Sscanf.scan(buffer, "my hex string: %Xn", 1);System.out.println("parse count: " + output.length);System.out.println("hex str1: " + (Long)output);// Output:// parse count: 1// hex str1: 3735928559
3 per la risposta № 4
per “17-MAR-11 15.52.25.000000000”:
SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yy HH.mm.ss.SSS");try{Date parsed = format.parse(dateString);System.out.println(parsed.toString());}catch (ParseException pe){System.out.println("ERROR: Cannot parse "" + dateString + """);}
2 per la risposta № 5
Questo è lontano dall’essere una soluzione così elegante come sarebbe stato ottenuto Con l’uso di espressioni regolari, ma dovrebbero funzionare.
public static void stringStuffThing(){String x = "17-MAR-11 15.52.25.000000000";String y = x.split(" ");for(String s : y){System.out.println(s);}String date = y.split("-");String values = y.split("\.");for(String s : date){System.out.println(s);}for(String s : values){System.out.println(s);}
0 per la risposta № 6
Conosci il concetto di espressioni regolari? Java ti dà la possibilità di utilizzare le espressioni regolari usando la classe del modello. Guarda questo: http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html
Puoi testare la tua catena in questo modo:
Matcher matcher = Pattern.match(yourString);matcher.find();
E quindi utilizzare i metodi forniti dal matcher per manipolare la catena che hai trovato o meno.
-3 per la risposta № 7
System.in.read () è un’altra opzione.