什么是sscanf的Java等价物,用于使用已知模式解析字符串中的值?

Kid*_*rla 29 java scanf

所以我来自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位数组成.

  • 我认为你需要在调用`m.group()之前调用`m.find()`. (13认同)
  • C确实有宽度说明符.所以你可以说"%2d"来指定你需要两个数字.只需0.02美分!:) (8认同)
  • 另请注意,您可以捕获除小数秒部分之外的所有内容作为单个组,并使用SimpleDateFormat("dd-MMM-yy hh.mm.ss")将其解析为Date. (6认同)

小智 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)