Quin és l’equivalent en Java de sscanf per analitzar valors d’una cadena usant un patró conegut? – java, scanf

Llavors vinc d’un fons C (originalmenteoriginalmente, encara que no he fet servir aquest llenguatge durant gairebé 5 anys) i estic intentant analitzar alguns valors d’una cadena en Java. En C faria servir sscanf. En Java, la gent m’ha dit “faci servir Scanner, o StringTokenizer”, però no puc veure com usar-los per aconseguir el meu propòsit.

El meu cadena d’entrada s’assembla a “17-MAR-11 15.52.25.000000000 “. En C faria alguna cosa com:

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

Però en Java, tot el que puc fer és coses com:

scanner.nextInt();

Això no em permet verificar el patró, i per a “MAR” acabo havent de fer coses com:

str.substring(3,6);

Horrible! Segurament hi ha una millor manera?

Respostes

37 per a la resposta № 1

El problema és que Java no té paràmetres (o passant per referència) com C o C #.

Però hi ha una millor manera (i més sòlida). Usa expressions regulars:

Pattern p = Pattern.compile("(\d+)-(\p{Alpha}+)-(\d+) (\d+)\.(\d+)\.(\d+)\.(\d+)")Matcher m = p.matcher("17-MAR-11 15.52.25.000000000");day = m.group(1);month= m.group(2);....

Per descomptat, el codi C és més concís, però estola tècnica té un benefici: Patrons especifica un format més precís que “% s “i”% d “. Per tant, pot usar d {2} per especificar que aquest dia HA estar compost exactament per 2 dígits.

21 per a la resposta № 2

Aquí hi ha una solució amb escàners:

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 a la resposta № 3

Cap d’aquests exemples va ser realment satisfactori per a mi, així que vaig fer la meva pròpia utilitat java sscanf:

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

Aquí hi ha un exemple d’anàlisi d’una cadena hexadecimal:

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 resposta № 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 a la resposta № 5

Això està lluny de ser una solució tan elegant com la que s’obtindria amb l’ús d’expressions regulars, però hauria de funcionar.

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 a la resposta № 6

Coneixes el concepte d’expressions regulars? Java li brinda la capacitat d’utilitzar expressions regulars utilitzant la classe Patró. Mira aquest: http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

Podeu provar la seva cadena d’aquesta manera:

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

i després utilitzeu els mètodes proporcionats per matches per manipular la cadena que va trobar o NO.

-3 per a la resposta № 7

System.in.read () és una altra opció.

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *