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.