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中是一个特殊字符,在正则表达式语法中,它需要双转义。