Qual é o equivalente java do SSCANF para analisar valores de uma corrente usando um padrão conhecido? – Java, SCANF

Então eu venho de um fundo C (originalmente orlliginally, embora eu não tenha usado essa linguagem por quase 5 anos) e estou tentando analisar alguns valores de uma cadeia em Java. Em C eu usaria SSCANF. Em Java, as pessoas me disseram “usar scanner ou stringtokizer”, mas não consigo ver como usá-las para alcançar o meu propósito.

minha cadeia de entrada parece “17-mar-11 15.52.25.000000000” . Em c eu faria algo como:

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

Mas em Java, tudo o que posso fazer é coisas como:

Isso não permite que eu verifique o padrão, e para “Sea” termino de ter que fazer coisas como:

str.substring(3,6);

Horrível! Certamente há uma maneira melhor?

respostas

37 para a resposta № 1

O problema é que o Java não tem parâmetros (ou passe por referência) como c ou c #.

Mas há uma maneira melhor (e mais sólida). Use expressões regulares:

Claro, o código C é mais conciso, mas a estola técnica tem um benefício: os padrões especificam um formato mais preciso do que “% s” E “% d”. Portanto, você pode usar d {2} para especificar que esse dia deve ser composto exatamente por 2 dígitos.

21 para a resposta № 2

Aqui está uma solução com scanners:

8 para a resposta № 3

Nenhum desses exemplos foi realmente satisfatório para mim, então eu fiz o meu próprio utilitário java sscanf:

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

Aqui está um exemplo de análise de uma seqüência hexadecimal:

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

Este está longe de ser uma solução tão elegante como seria obtida Com o uso de expressões regulares, mas deve 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

Você conhece o conceito de expressões regulares? O Java oferece a capacidade de usar expressões regulares usando a classe Pattern. Olhe para este: http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

Você pode testar sua corrente dessa maneira:

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

e, em seguida, use os métodos fornecidos pelo correspondente para manipular a cadeia que você encontrou ou não.

-3 para a resposta № 7

system.in.read () é outra opção.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *