所以我来自C背景(原来最初,虽然我已经有近5年没用过那种语言了)而且我正在尝试用Java中的字符串解析一些值.在CI中将使用sscanf.在Java中,人们告诉我"使用Scanner或StringTokenizer",但我看不出如何使用它们来实现我的目的.
我的输入字符串看起来像"17-MAR-11 15.52.25.000000000".CI会做类似的事情:
sscanf(thestring, "%d-%s-%d %d.%d.%d.%d", day, month, year, hour, min, sec, fracpart);
Run Code Online (Sandbox Code Playgroud)
但在Java中,我所能做的就是:
scanner.nextInt();
Run Code Online (Sandbox Code Playgroud)
这不允许我检查模式,对于"MAR"我最终不得不做以下事情:
str.substring(3,6);
Run Code Online (Sandbox Code Playgroud)
可怕!当然有更好的方法吗?
kor*_*fey 39
问题是Java没有输出参数(或通过引用传递)为C或C#.
但是有一种更好的方式(更坚实).使用正则表达式:
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);
....
Run Code Online (Sandbox Code Playgroud)
当然C代码更简洁,但这种技术有一个利润:模式指定格式比'%s'和'%d'更精确.因此,您可以使用\ d {2}指定那天必须由2位数组成.
小智 22
以下是使用扫描仪的解决方案:
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());
Run Code Online (Sandbox Code Playgroud)
use*_*323 11
这些例子都不是我真的很满意,所以我创建了自己的java sscanf实用程序:
https://github.com/driedler/java-sscanf/tree/master/src/util/sscanf
这是解析十六进制字符串的示例:
String buffer = "my hex string: DEADBEEF\n"
Object output[] = Sscanf.scan(buffer, "my hex string: %X\n", 1);
System.out.println("parse count: " + output.length);
System.out.println("hex str1: " + (Long)output[0]);
// Output:
// parse count: 1
// hex str1: 3735928559
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
69531 次 |
| 最近记录: |