hasNext()的Java正则表达式匹配下一个结尾

时间:2013-10-19 04:15:49

标签: java regex java.util.scanner

假设我从输入文件构建一个新的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)时,它甚至会失败。然后我意识到$匹配字符串的结尾或输入的结尾,这既不是所呈现的情况(除非在最后)。鉴于此,我将如何匹配下一个输入的结束?

2 个答案:

答案 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”,根据需要跳过其他字符。