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ó.