根据JavaAPI Scanner使用分隔符将整个输入分解为标记。我正在尝试理解标记和分隔符。我正在做这个程序,遇到了一个混乱
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner s = null;
try {
s = new Scanner(System.in);
s.useDelimiter("A");
System.out.println("1 " + s.next().length());
System.out.println("2 " + s.next().length());
System.out.println("3 " + s.next().length());
System.out.println("4 " + s.next().length());
} finally {
if (s != null) {
s.close();
}
}
}
}
当我使用输入AAAAasdf
时,我得到以下输出。
1 0
2 0
3 0
4 0
我可以理解这个输出,因为分隔符之间的标记长度为零,因此所有标记都为零,但当我使用默认分隔符并将输入作为
<代码>\uuuuuuuaaa\n-
为此,我得到的输出为
1 3
我无法理解。我给了5个空格,所以它们之间应该有4个长度为0的标记。为什么不呢?我错过了什么?
Scanner.next()
函数查找并返回此扫描仪中的下一个完整标记。完整标记的前面和后面都有与分隔符模式
匹配的输入。默认模式是\\p{javaWhitespace}
。
要更好地理解它,请尝试设置分隔符"\\s*"
:
Scanner scanner = new Scanner(System.in);
scanner.useDelimiter("\\s*");
while(scanner.hasNext())
System.out.println(scanner.next());
对于输入123,它是扫描仪。next()将打印:
1 // first println
2 //snd println
3 // third println
正如X*
所说,模式X
可以出现零次或多次。此表达式称为Quantifier。但是表达式X
表示X,一次或多次
。因此,请尝试使用分隔符"[A]"
表示"A"
出现一次或多次,并匹配任意数量的连续"A"
很有意思的是,当我们在代码中指定“”(空白)作为分隔符时
try {
s = new Scanner(System.in);
s.useDelimiter(" ");
System.out.println("1 " + s.next().length());
System.out.println("2 " + s.next().length());
System.out.println("3 " + s.next().length());
System.out.println("4 " + s.next().length());
} finally {
if (s != null) {
s.close();
}
}
输入是
[5 spaces]asdf
我们看到输出
1 0
2 0
3 0
4 0
但是当我们不指定分隔符时,
try {
s = new Scanner(System.in);
//s.useDelimiter(" ");
System.out.println("1 " + s.next().length());
System.out.println("2 " + s.next().length());
System.out.println("3 " + s.next().length());
System.out.println("4 " + s.next().length());
} finally {
if (s != null) {
s.close();
}
}
同样的输入
[5 spaces]asdf
生成不同的输出
1 4
因此,我认为指定分隔符,即使默认的分隔符会使扫描器跳过所有空标记。
useDelimiter采用正则表达式模式。默认模式为
private static Pattern WHITESPACE_PATTERN = Pattern.compile(
"\\p{javaWhitespace}+");
它将匹配任意数量的连续空格。如果希望分隔符匹配任意数量的连续A,请尝试以下操作
s.useDelimiter("[A]+");
阅读以下内容:http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#useDelimiter(java.lang.String)http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#reset()
问题内容: 我想为扫描器指定一个分隔符,该分隔符可以按某种模式进行拆分,但不会从令牌中删除该模式。我似乎无法完成这项工作,因为正则表达式所标识的所有内容也会作为分隔符的一部分被占用。有什么建议? 我的具体问题是,我的文件看起来像: 我想从文本/数字混合+行中分离出来,直到下一个文本/数字混合。我有正则表达式来标识它们,但是如上所述,因为定界符占用了我想要的内容,所以使用了它。 编辑:代码添加: 是
我目前正在执行游戏风险。在我的Board课程中,我阅读了三个不同的文本文件,其中包括国家、大陆及其邻近地区。当我构建一个新大陆时,它的构造器需要以下内容(字符串名、int-bonusArmies、ArrayList-memberCountries)。现在,我用扫描器从一个文本文件中读取,这个文件是这样组织的,它的名字,它拥有的奖金军队,每行的其余部分是它的成员国。 北美、5、阿拉斯加、阿尔伯塔省、
当我试图在Eclipse中运行我的程序时,我收到以下错误: 在java.util.scanner.throwfor(Scanner.java:864),java.util.scanner.next(Scanner.java:1485),java.util.scanner.nextInt(Scanner.java:2117),java.util.scanner.nextInt(Scanner.jav
问题内容: 我正在编写一个使用Event类的程序,该类中有一个日历实例和一个String类型的描述。创建事件的方法使用扫描仪获取月,日,年,小时,分钟和说明。我遇到的问题是Scanner.next()方法仅返回空格之前的第一个单词。因此,如果输入为“我的生日”,则该事件实例的描述就是“我的”。 我做了一些研究,发现人们使用Scanner.nextLine()解决此问题,但是当我尝试这样做时,它只是
我有一个类,它创建多个对象,并将它们放入中,如下所示: 我有一个应用程序,它从控制台扫描输入“add”,如果找到,就调用方法,如下所示: 应用程序应该允许用户输入“add”,但在调用方法后,将出现错误“no line found”。 我猜这是因为方法中的没有关闭,然后在需要时重新打开。这是程序的问题吗?如果是,我该如何修复它? 请注意,这个程序还没有完成,因为我将添加一个出售这些股票的销售方法。这
我正在尝试编写一个应用程序,它将占用一个非常大的sql文本文件~60GB(2.57亿行),并将每个COPY语句拆分为单独的文本文件。 但是,我目前使用的代码会导致OutOfMemoryError,因为行超过了扫描仪缓冲区限制。第一个语句将是4000万行。 请提供建议,说明这是执行此操作的错误方法还是对现有方法的修改。 谢啦