Qual è l’equivalente Java di SScanf per analizzare i valori di una catena utilizzando un modello noto? – Java, Scanf

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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *