Quel est l’équivalent Java de SSCANF pour analyser les valeurs d’une chaîne à l’aide d’un motif connu? – Java, scanf

Puis je viens d’un fonds C (à l’origine orlliginally, bien que je n’ai pas utilisé cette langue pendant près de 5 ans) et j’essaie d’analyser certaines valeurs d’une chaîne en Java. En C, j’utiliserais SSCANF. En Java, les gens m’ont dit « Utiliser Scanner ou StringTokenizer », mais je ne peux pas voir comment les utiliser pour atteindre mon objectif.

Ma chaîne d’entrée ressemble à « 17-Mar-11 15.52.25.000000000 » . Dans C, je ferais quelque chose comme:

sscanf(thestring, "%d-%s-%d %d.%d.%d.%d", day, month, year, hour, min, sec, fracpart);

mais en Java, tout ce que je peux faire est des choses comme:

scanner.nextInt();

Cela ne me permet pas de vérifier le motif, et de « mer » que je finis à faire des choses comme:

str.substring(3,6);

Horrible! Il y a sûrement une meilleure façon?

Réponses

37 pour la réponse № 1

Le problème est que Java n’a pas de paramètres (ou de transmettre par référence) comme C ou C #. / P>

Mais il y a un meilleur moyen (et plus solide). Utilisez des expressions régulières:

bien sûr, le code C est plus concis, mais la volée technique a une prestation: les motifs spécifient un format plus précis que « % s » Et « % d ». Par conséquent, vous pouvez utiliser D {2} pour spécifier que ce jour-ci doit être composé exactement de 2 chiffres.

21 pour la réponse № 2

Voici une solution avec des scanners:

8 pour la réponse № 3

Aucun de ces exemples n’a été vraiment satisfaisant pour moi, alors j’ai fait ma propre utilitaire Java SSCANF:

https://github.com/driedler/java-sscanf/tree/master/src/util/sscanf

Voici un exemple d’analyse d’une chaîne hexadécimale:

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 pour la réponse № 4

pour « 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 pour la réponse № 5

Ceci est loin d’être une solution aussi élégante que possible. Avec l’utilisation d’expressions régulières, mais devrait fonctionner.

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 pour la réponse № 6

Connaissez-vous le concept d’expressions régulières? Java vous donne la possibilité d’utiliser des expressions régulières en utilisant la classe de motifs. Regardez ceci: http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

Vous pouvez tester votre chaîne de cette façon:

Matcher matcher = Pattern.match(yourString);matcher.find();

Ensuite, utilisez les méthodes fournies par correspondeur pour manipuler la chaîne que vous avez trouvée ou non.

-3 pour la réponse № 7

System.in.read () est une autre option.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *