使用Java Scanner';s hasNext(Pattern)查找前导'+';

使用Java Scanner';s hasNext(Pattern)查找前导'+';,java,Java,我有一个扫描器,在我尝试hasNext(Pattern)方法查找前导“+”字符之前,它一直工作顺利。以下是我一直试图做的: File file = new File("Somefile.txt"); Scanner input = new Scanner(file); while (!input.hasNext(Pattern.compile("^\\+"))) { System.out.println("No leading +:" + input.next()); } 这似乎很有道理

我有一个扫描器,在我尝试hasNext(Pattern)方法查找前导“+”字符之前,它一直工作顺利。以下是我一直试图做的:

File file = new File("Somefile.txt");
Scanner input = new Scanner(file);
while (!input.hasNext(Pattern.compile("^\\+"))) {
   System.out.println("No leading +:" + input.next());
}

这似乎很有道理。然而,程序无休止地循环通过大量以“+”开头的行。我做错了什么?

javadoc提到hasNext()方法:

如果下一个完整标记与指定模式匹配,则返回true

在本例中,由于您没有更改分隔符,所以“完整标记”由空格限定。您将只在标记的开头找到孤立的“+”符号,而不是“+”符号


此外,还不清楚“前导“+”字符是什么意思。您的意思是在一行的开头还是在每个标记的开头?

问题是您试图将标记与
^
的行开头进行匹配。标记永远不会包含新行开始(它们只是由分隔符分隔的子字符串),因此
^
没有意义。如果你想用扫描仪读行,我建议你这样做

Scanner input = new Scanner(file).useDelimiter("\n");
然后简单地放下
^
,它就会工作:

while (!input.hasNext(Pattern.compile("\\+.*")))
    System.out.println("No leading +: " + input.next());

没错,这就是我们要走的路。我试图将我对正则表达式的理解从perl翻译过来,这显然有点棘手。非常感谢!