利用Scanner的findInLine可以在当前行中查找符合正则表达式的子字符串。使用findInLine可以一定程度上代替C语言的sscanf。findInLine可以自动跳过无用的字符串,这与sscanf的特性相同。
如果当前行没有合适的子字符串,且源字符串还有下一行,则需要调用nextLine进入下一行重新查找。
这里列出一些目前常用的正则表达式:
- 查找boolean字符串:[Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee]。它的特点是不区分大小写,可识别"true"和"false";
- 查找小数字符串:[\+-]?\d+\.\d*|[\+-]?\d*\.\d+。它用于查找带有一个小数点的数字。小数点左边或右边可以无数字。可识别"1.123"(小数点既不在最左,也不在最右)、".123"(小数点在最左)、"123."(小数点在最右);
- 查找科学计数字符串:[\+-]?\d+\.\d*[ ]*[eE][\+-]?\d+|[\+-]?\d*\.\d+[ ]*[eE][\+-]?\d+|[\+-]?\d+[ ]*[eE][\+-]?\d+。它用于查找含'e'或'E'的小数;
- 查找整数字符串:[\+-]?\d+。用于连续的纯数字;
- 查找各种数字和浮点数:[\+-]?\d+\.\d*[ ]*[eE][\+-]?\d+|[\+-]?\d*\.\d+[ ]*[eE][\+-]?\d+|[\+-]?\d+[ ]*[eE][\+-]?\d+|[\+-]?\d+\.\d*|[\+-]?\d*\.\d+|[\+-]?\d+。即科学计数、小数、整数按先后顺序并联起来。
使用Scanner时,需要考虑到程序性能。因为Scanner的性能不佳,如果只是相查找简单的数字格式,可以看看我另一篇文章:
分享java sscanf函数
使用sscanf可以达到近百倍的速度,但是它的功能还不完整,无法读取科学计数格式的数字,不支持C语言sscanf的很多高级特性。使用前请试验一下,看看是否有你需要的功能,如果没有你要的功能,再考虑使用Scanner。