`
xlcai
  • 浏览: 18960 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于Scanner的useDelimiter使用其它字符做为分隔符的详细用法及特别之处

 
阅读更多

由于最近在百度知道上遇到点特殊的问题,研究查阅后了解了些东西,拿出来分享下,这里只针对Scanner的next()说它的分隔符,next()方法

查找并返回来自此扫描器的下一个完整标记。完整标记的前后是与分隔模式匹配的输入信息。即使以前调用 hasNext()返回了 true,在等待要扫描的输入时此方法也可能阻塞。

import java.util.Scanner;

public class TestSc {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		//sc.useDelimiter("a");
		while (sc.hasNext()) {
			System.out.println("hasNext()判断为true,我还有下一个:");
			System.out.println("下一个输出是:"+sc.next());
		}
	}
}


Scanner默认使用的分隔符是空格、回车和tab,所以我们运行上述代码后输入 a空格b'Tab'c回车 后输出的结果是:

这时我们用useDelimiter改变其分割字符为"a";即将上面的注释代码取消注释。重新运行,这时我们输入a空格b'Tab'c回车后结果是:


这时我们发现虽然hasNext判断为true,但并没有输出next()的值。这里的原因API已经说清楚了,即使以前调用hasNext()返回了true,在等待要扫描的输入时此方法也可能阻塞。此时还在等待输入,并没有扫描到下一个分隔符“a"(换用其它字符后,默认的tab建回车键不再起分隔符的作用,回车键只起了提交的作用)所以并没有输出next()的值,这时我们想输出后面的bc只需要在等待输入的窗口继续输入一个"a"回车,再看:

这时就将两个分隔符a,之间的字符串输出来了。至于后面说我还有下一个,其实是刚才如入的回车。程序还在继续等待扫描输入....

再换一种方式,不用System.in了


直接用字符串,默认空格,回车,tab做分隔符时,输出如此,\n为回车\t为tab,中间的长空格是我直接按的tab键都生效了。

再次将注释去掉结果如下

这时我们发现tab和回车不再当做分隔符,而是被直接输出了,而且e后面没有分隔符“a”还是输出了,因为此时并没有等待扫描输入了。

就是这些,另外如果我们不想严格的使用某个字符,比如有个我们想用yes和回车做分隔符,我们可以用正则表达式,然后我们需要去分割的里面输入并不严格,有时yes前后有一个或多个空格,回车也是有时会空格后再回车,但我们不想要yes和回车前后的空格,而单独的空格没有yes和回车的话我们又要保留,则应该这样写:

import java.util.Scanner;

public class TestSc {
	public static void main(String[] args) {
		Scanner sc = new Scanner("a b	yes      byes c \n  d\te");
		sc.useDelimiter("\\s*yes\\s*|\\s*\n\\s*");
		while (sc.hasNext()) {
			System.out.print("有下一个,");
			System.out.print("下一个输出是:"+sc.next());
		}
	}
}
为了看出效果,我们不再用带回车的输出行System.out.println而是用System.out.print.效果如下:

这里的正则表达式"\\s*yes\\s*|\\s*\n\\s*"解释。\s可以匹配空格、制表符、换页符等空白字符的其中任意一个,用了两个\第一个\的转义字符,第二个是连用的\s。*修饰匹配次数为 0 次或任意次如果想匹配*这个字符的话需要用\*。后面yes不用说,再后面又一个\\s*,表明分割字符为yes,前后可有0个或任意个空格,制表符等。。后面的'|'或的意思,同理表示回车前后可有0或任意个....其中的第一个yes前输入的是tab和后面的\t都被\s匹配掉而没有输出。

Java学习交流群: 2177712

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics