使用scanner.next()返回下n个字符

时间:2018-03-19 20:47:57

标签: java regex java.util.scanner

我正在尝试使用扫描程序解析一些文本,但我不断收到InputMismatchException。我正在使用scanner.next(模式模式)方法,我想返回下n个字符(包括空格)。

例如,在尝试解析时

"21        SPAN 1101"

我想将前4个字符("21 ")存储在变量中,然后将另外6个字符(" ")存储在另一个变量中,然后存储下一个5("SPAN "),最后是4("1101"

到目前为止我所拥有的是:

String input =  "21        SPAN 1101";
Scanner parser = new Scanner(input);
avl = parser.next(".{4}");
cnt = parser.next(".{6}");
abbr = parser.next(".{5}");
num = parser.next(".{4}");

但是这仍然会抛出一个InputMismatchException,即使根据scan.next(模式模式)的java 8文档,它也不会抛出那种类型的异常。即使我明确声明了模式然后将该模式传递给方法,我也会得到相同的异常。

我是否完全用错误的类/方法解决了这个问题?据我所知,我的语法是正确的,但我仍然无法弄清楚为什么我会得到这个例外。

2 个答案:

答案 0 :(得分:3)

next(String pattern)的文档中,我们可以发现它(强调我的)

  

如果匹配从指定字符串构建的模式,则返回下一个标记

Scanner用作默认分隔符一个或多个空格,因此它不会将空格视为令牌的一部分。因此,它返回的第一个标记是"21",而不是"21 "因此条件“......如果它匹配从指定字符串构造的模式”由于其长度而未满足.{4}

最简单的解决方案是使用nextLine()读取整行,并通过正则表达式(如(.{4})(.{6})(.{5})(.{4})或一系列子串方法将其拆分为单独的部分。

答案 1 :(得分:1)

您可能需要考虑创建一个方便的方法来将输入字符串切换为可变数量的可变长度片段,因为Scanner.next()的方法似乎因为不考虑空格作为标记的一部分而失败(使用空格)默认为分隔符)。这样你就可以将输入String的结果片段存储在一个数组中,并将数组的特定元素分配给其他变量(我在注释中对正确的行做了一些额外的解释):

public static void main(String[] args) throws IOException {
    String input =  "21        SPAN 1101";
    String[] result = cutIntoPieces(input, 4, 6, 5, 4);

    // You can assign elements of result to variables the following way:
    String avl = result[0];  // "21  " 
    String cnt = result[1];  // "      "
    String abbr = result[2]; // "SPAN "
    String num = result[3];  // "1101"

    // Here is an example how you can print whole array to console:
    System.out.println(Arrays.toString(result)); 
}

public static String[] cutIntoPieces(String input, int... howLongPiece) {
    String[] pieces = new String[howLongPiece.length]; // Here you store pieces of input String
    int startingIndex = 0;
    for (int i = 0; i < howLongPiece.length; i++) { // for each "length" passed as an argument...
        pieces[i] = input.substring(startingIndex, startingIndex + howLongPiece[i]); // store at the i-th index of pieces array a substring starting at startingIndex and ending "howLongPiece indexes later"
        startingIndex += howLongPiece[i]; // update value of startingIndex for next iterations
    }
    return pieces; // return array containing all pieces
}

你得到的输出:

[21  ,       , SPAN , 1101]