Cal é o equivalente Java de SSCANF para analizar valores dunha cadea usando un patrón coñecido? – Java, Scanf

Entón veño dun fondo C (orixinalmente orliginalmente, aínda que non usei esa lingua por case 5 anos) e estou tentando analizar algúns valores dunha cadea en Java. En C I usaría SSCANF. En Java, a xente díxome “Usar escáner ou Stringtokenizer”, pero non podo ver como usalos para conseguir o meu propósito.

A miña cadea de entrada parece “17-mar-11 15.52.25.000000000” .. En C, faría algo así como:

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

pero en Java, todo o que podo facer é cousas como:

scanner.nextInt();

Isto non me permite verificar o patrón e, por “mar”, termino ter que facer cousas como:

str.substring(3,6);

Horrible! Seguramente hai un xeito mellor?

respostas

37 para a resposta № 1

O problema é que Java non ten parámetros (ou pase por referencia) como c ou c #.

Pero hai un xeito mellor (e máis sólido). Use expresións regulares:

Por suposto, o código C é máis conciso, pero a roubada técnica ten un beneficio: os patróns especifican un formato máis preciso que “% s” E “% d”. Polo tanto, pode usar D {2} para especificar que ese día debe estar composto por 2 díxitos.

21 para a resposta № 2

Aquí está unha solución con escáneres:

8 para a resposta № 3

Ningún destes exemplos foi realmente satisfactorio para min, entón eu fixen a miña propia utilidade Java SSCANF:

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

Aquí tes un exemplo de análise dunha cadea 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 para a resposta № 4

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

Isto está lonxe de ser unha solución tan elegante como se obtería Co uso de expresións regulares, pero debería 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 para a resposta № 6

Coñeces o concepto de expresións regulares? Java dálle a capacidade de usar expresións regulares usando a clase de patrón. Mire isto: http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

pode probar a súa cadea deste xeito:

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

e logo use os métodos proporcionados polo combatimiento para manipular a cadea que atopou ou non.

-3 para a resposta № 7

system.in.read () é outra opción.

Deixa unha resposta

O teu enderezo electrónico non se publicará Os campos obrigatorios están marcados con *