2014-05-07 38 views
1

用户将在此处输入=(数字)。然后我想让它切断a =并保留这个数字。它在我使用s.next()时起作用,但当然它使我输入了两次我不想要的东西。用s.nextLine()我输入一次,分隔符不起作用。为什么是这样?Deliminter不适用于扫描仪

Scanner s = new Scanner(System.in); 
    s.useDelimiter("a="); 
    String n = s.nextLine(); 
    System.out.println(n); 

回答

1

因为nextLine()不关心分隔符。当您告诉它返回令牌时,分隔符只会影响ScannernextLine()只是返回当前行中的任何内容而不关心令牌。

分隔符不是去这里的路;分隔符的目的是告诉Scanner什么可以在令牌之间出现,但是您正尝试将它用于它不适用的目的。代替:

String n = s.nextLine().replaceFirst("^a=",""); 

此接口输入的线,然后剥去a=如果它出现在字符串的开头(即,它与空字符串""代替它)。 replaceFirst需要正则表达式,并且^表示它只在a=位于字符串的开头时才匹配。这不会检查以确保用户实际输入了a=;如果你想检查一下,你的代码将需要更复杂一点,但关键在于你想用s.nextLine()返回String,然后在String上做任何你需要的检查和操作。

+0

有没有办法为更换名单做到这一点。假设我也想为b =做这个。有没有办法做到这一点,而不是列出n.replaceFirst(“^ b =”,“”); n.replaceFirst( “^ C =”, “”);等等.. –

+0

@Theunknown您可能想要在正则表达式上查看[本教程](http://docs.oracle.com/javase/tutorial/essential/regex/)。对于像你说的简单情况,你可以使用'“^(a | b | c)=”'或'“^ [abc] =”'作为正则表达式。第二个只能用单个字母工作。如果你想保存在'='之前出现的文本,还有其他方法,使用正则表达式或其他'String'方法。 – ajb

+0

我一定会阅读这些教程。谢谢你的帮助! –

0

如果Scanner#useDelimiter()不适合您的情况,请尝试StringTokenizer

Scanner s = new Scanner(System.in); 
String n = s.nextLine(); 
StringTokenizer tokenizer = new StringTokenizer(n, "a="); 

while (tokenizer.hasMoreTokens()) { 
    System.out.println(tokenizer.nextToken()); 
} 

或尝试用String#split()方法

for (String str : n.split("a=")) { 
    System.out.println(str); 
} 

输入:

a=123a=546a=78a=9 

输出:

123 
546 
78 
9