为什么java.util.Scanner next()。charAt(0)返回“ {”,而我的nextCharIs(scanner,“ {”)方法返回false?

时间:2019-10-13 15:43:52

标签: java java.util.scanner

我正在用Java编写递归的体面解析器,并在读取的Factor方法中检查扫描器中的下一个字符是否为“ {”。我使用方法nextCharIs(Scanner in, Char c)确定下一个字符是否与模式匹配。在此代码中,扫描仪中的下一个字符为“ {”,但该方法返回false。 nextChar返回“ {”,而nextCharIs(in,"{")返回false。为什么会这样?

char nextChar(Scanner in) {
    return in.next().charAt(0);
}

boolean nextCharIs(Scanner in, char c) {
    return in.hasNext(Pattern.quote(c+""));
}

1 个答案:

答案 0 :(得分:0)

Java documentation中:“扫描程序使用定界符模式将输入分为令牌,默认情况下与空格匹配。”

您正在使用scanner.hasNext(Pattern.quote("{"))进行操作的任何额外图层都没有。如果您还有new Scanner(someText);,则可能是这种情况。我必须将“ {”替换为“ x”,否则我的降价检查会出现问题:

someText    hasNext(Pattern.quote("x"))
"x"         y
"xx"        n
"x "        y
"x x"       y

@Test
    public void testScan(){
        assertEquals(Collections.emptyList(), scanLBrace("x"));
        assertEquals(Collections.emptyList(), scanLBrace("{{"));
        assertEquals(Arrays.asList("{"), scanLBrace("{"));
        assertEquals(Arrays.asList("{", "{"), scanLBrace("{ {"));
    }


     List<String> scanLBrace(String text){
        List<String> result = new ArrayList<>();
        Scanner s = new Scanner(text);
        while (s.hasNext(Pattern.quote("{")))
        {
            result.add(s.next());
        }
        return result;
    }