1

假设我从输入文件构造了一个新的 Scanner

Scanner aScanner = new Scanner(new FileReader("file.txt"));

并且 file.txt 有多个这样的行

blah blah blah blah
blah blah blah

我想检查 Scanner 是否有与我的模式匹配的下一个值:

 aScanner.hasNext("blah");

这很好用。但是,当我尝试使用行尾字符 $ 时:

 aScanner.hasNext("blah$");

它失败。当我标记多行(?m)时,它甚至会失败。然后我意识到 $ 匹配字符串的结尾或输入的结尾,这两种情况都不是(除了最后)。鉴于此,我将如何匹配下一个输入的结尾?

4

2 回答 2

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")。第二个与 that 以及 by 匹配,hasNext("(?m)blah$")因为它位于行尾。第三个再次仅由 匹配hasNext("blah")。第四个匹配所有条件,因为它既位于行尾,又位于文件末尾。

于 2013-10-19T04:27:43.733 回答
1

传递给的参数是分隔符hasNext()的模式,然后在调用时使用next()

尝试使用后视代替:

aScanner.hasNext("(?<=blah)\\s+");

这表示使用空格作为分隔符,但前提是前面有“blah”,尽管这会消耗所有内容到“blah”,并根据需要跳过其他字符。

于 2013-10-19T04:33:32.190 回答