Java相当于sscanf的东西是什么,用于使用已知模式从字符串中解析值?

2022-09-01 04:16:29

所以我来自C背景(最初,尽管我已经将近5年没有使用这种语言了),我正在尝试从Java中的字符串中解析一些值。在C中,我会使用sscanf。在Java中,人们告诉我“使用Sner scanner或StringTokenizer”,但我不知道如何使用它们来实现我的目的。

我的输入字符串看起来像“17-MAR-11 15.52.25.000000000”。在C中,我会做这样的事情:

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

但是在Java中,我所能做的就是:

scanner.nextInt();

这不允许我检查模式,对于“MAR”,我最终不得不做这样的事情:

str.substring(3,6);

可怕!肯定有更好的方法吗?


答案 1

问题是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);
....

当然,C代码更简洁,但这种技术有一个好处:Patterns指定的格式比'%s'和'%d'更精确。因此,您可以使用 \d{2} 指定日期必须正好由 2 位数字组成。


答案 2

以下是使用扫描仪的解决方案:

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());

推荐