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.