假设我从输入文件构建一个新的Scanner
Scanner aScanner = new Scanner(new FileReader("file.txt"));
并且file.txt有多行像这样
blah blah blah blah
blah blah blah
我想检查一下扫描仪是否有与我的模式匹配的下一个值:
aScanner.hasNext("blah");
工作正常。但是,当我尝试使用行尾字符$:
时 aScanner.hasNext("blah$");
失败了。当我标记多行(?m)时,它甚至会失败。然后我意识到$匹配字符串的结尾或输入的结尾,这既不是所呈现的情况(除非在最后)。鉴于此,我将如何匹配下一个输入的结束?
答案 0 :(得分:1)
hasNext("blah$")
只能在下一个标记为字符串“blah”后跟文件末尾(或(?m)
行的结尾时匹配。
这可能很有启发性:
public static void main(String[] args) {
Scanner s = new Scanner(new StringReader("blah blah\nblah blah"));
for (int i = 0; i < 4; i++) {
System.out.println(s.hasNext("blah"));
System.out.println(s.hasNext("blah$"));
System.out.println(s.hasNext("(?m)blah$"));
s.next();
}
}
那里有四个等等。第一个只与hasNext("blah")
匹配。第二个与hasNext("(?m)blah$")
相匹配,因为它位于一行的末尾。第三个仅与hasNext("blah")
匹配。第四个匹配所有条件,因为它在行的末尾和文件的末尾。
答案 1 :(得分:1)
传递给hasNext()
的参数是分隔符的模式,然后在调用next()
时消耗。
尝试使用后视:
aScanner.hasNext("(?<=blah)\\s+");
这表示使用空格作为分隔符,但前面只有“blah”,尽管这会消耗掉一切“blah”,根据需要跳过其他字符。