Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Scanner hasNext(字符串模式)错误地返回true_Java_Regex_Java.util.scanner - Fatal编程技术网

Java Scanner hasNext(字符串模式)错误地返回true

Java Scanner hasNext(字符串模式)错误地返回true,java,regex,java.util.scanner,Java,Regex,Java.util.scanner,我已经编写了一个用于解析模板的扫描工具。 考虑代码片段: String input = FileUtils.readFileToString(new File("input file path")); Scanner scanner = new Scanner(input); scanner.useDelimiter(System.getProperty("line.separator")); System.out.println("Checking"); while(scanner.has

我已经编写了一个用于解析模板的扫描工具。
考虑代码片段:

String input = FileUtils.readFileToString(new File("input file path"));

Scanner scanner = new Scanner(input);
scanner.useDelimiter(System.getProperty("line.separator"));

System.out.println("Checking");
while(scanner.hasNext())
{
    System.out.print(scanner.hasNext("\\s*#[^\\n]*"));
    System.out.println(" : " + scanner.nextLine());
}
输入文件内容:

# Line 1
#######################

# Check
 # Matched with spaces
     #


// End of file
注意:输入中不存在文件结尾行

产出:

Checking
true : # Line 1
true : #######################
true : 
true : # Check
true :  # Matched with spaces
true :       #
false :      
false :      
我的问题是为什么第三行hasNext()即使不是以“#”开头也返回true?
任何帮助都将不胜感激。

因为:

如果下一个标记与从指定字符串构造的模式匹配,则返回true


空行不包含任何标记,因此它正在从第4行查找下一个标记。

如hasNext(模式)文档中所述:“如果下一个完整标记与指定模式匹配,则返回true。完整标记由匹配分隔符模式的输入作为前缀和后缀。”我的分隔符是新行字符,因此,此处的完整标记应为“”,即空行。我错了吗?有一点,他们所指的分隔符模式是
\\s
空白
hasNext
不知道您的模式。在我的代码中,我将分隔符更改为new line scanner.useDelimiter(System.getProperty(“line.separator”))。hasNext在一个完整的令牌上运行。同样如文档中所述,“定界模式”\\s“可能返回空令牌,因为它一次只通过一个空格。”。因此,我假设它将返回hasNext操作的空令牌。正确吗?我明白了,也许你应该
扫描器。使用分隔符(\\n”)
,因为它需要一个正则表达式。或者
scanner.useDelimiter(Pattern.Quote(System.getProperty(“line.separator”))正确的正则表达式是“\\\r?\\\n”。反斜杠在java中是一个特殊字符,在正则表达式语法中,它需要双转义。