Care este echivalentul Java al Sscanf pentru a analiza valorile unui lanț utilizând un model cunoscut? – Java, scanf

apoi provin dintr-un fond C (inițial orliginic, deși nu am folosit acea limbă de aproape 5 ani) și încerc să analizez unele valori ale unui lanț în Java. În c i-aș folosi Sscanf. În Java, oamenii mi-au spus „Utilizați scanerul sau StringToKenizer”, dar nu văd cum să le folosesc pentru a-mi atinge scopul.

lanțul meu de intrare arată ca „17-Mar-11 15.52.25.000000000” . În c aș face ceva de genul:

divid id = „65BC9EBC41″>

dar în Java, tot ce pot face este cum ar fi:

scanner.nextInt();

Acest lucru nu-mi permite să verific modelul și pentru „marea” am terminat să fac lucruri cum ar fi:

str.substring(3,6);

Oribil! Desigur, există o cale mai bună?

Răspunsuri

37 Pentru răspunsul № 1

Problema este că Java nu are parametri (sau trece prin referință) ca C sau C #.

Dar există o cale mai bună (și mai solidă). Utilizați expresii regulate:

Desigur, codul este mai concis, dar tehnic furat are un beneficiu: modelele specifică un format mai precis decât „% s” Și „% d”. Prin urmare, puteți utiliza D {2} pentru a specifica că acea zi trebuie să fie compusă exact cu 2 cifre.

21 pentru răspunsul № 2

aici este o soluție cu scanere:

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 pentru răspunsul № 3

Niciunul dintre aceste exemple nu a fost într-adevăr satisfăcător pentru mine, așa că am făcut propria mea utilitate Java Sscanf:

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

aici este un exemplu de analiză a unui șir hexazecimal:

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 pentru răspunsul № 4

pentru „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 pentru răspunsul № 5

Acest lucru este departe de a fi o astfel de soluție elegantă cum ar fi obținută Cu utilizarea expresiilor regulate, dar ar trebui să funcționeze.

divid id = „1032A4F956″>

0 pentru răspunsul № 6

Știți conceptul de expresii regulate? Java vă oferă posibilitatea de a utiliza expresii regulate folosind clasa de model. Uită-te la acest lucru: http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

Puteți testa lanțul în acest mod:

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

apoi utilizați metodele furnizate de Matcher pentru a manipula lanțul pe care l-ați găsit sau nu.

-3 pentru răspunsul № 7

System.in.Read () este o altă opțiune.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *