如何让扫描仪忽略某种模式之间的单词

时间:2014-09-09 18:54:46

标签: java arraylist java.util.scanner

我想使用扫描仪从文件读取输入,但我希望扫描仪忽略内部的所有内容(* ....... *)。我该怎么做呢?我正在使用整数并将它们添加到数组列表中,但如果文本中有整数我想忽略它也会添加它们。

public ArrayList<Integer> readNumbers(Scanner sc) 
    {
        // TODO Implement readNumbers
        ArrayList<Integer> list = new ArrayList<Integer>();
        while(sc.hasNext())
        {
            try
            {
               String temp = sc.next();
               list.add(Integer.parseInt(temp));
             }
            catch(Exception e)
            {

            }
        } 
        return list;
    }

这是文本文件的示例行

(* 2013年阿拉巴马州21人口*)4802740

我会将21和4802740添加到我的数组列表中。 我想过要用    sc.usedelimiter( “(”);    sc.usedelimiter( “的)”); 但我似乎无法让它发挥作用。 谢谢!

2 个答案:

答案 0 :(得分:0)

在阅读下一个int:

之前跳过“(* string *)”
try
{
    try {
        sc.skip("\\s*\\(\\*[^*]*\\*\\)");
    } catch (NoSuchElementException e) {
    }
    String temp = sc.next();
    list.add(Integer.parseInt(temp));
} catch (Exception e) {
}

答案 1 :(得分:0)

您似乎正在寻找类似

的内容
sc.useDelimiter("\\(\\*[^*]*\\*\\)|\\s+");

此正则表达式\\(\\*[^*]*\\*\\)代表

的一部分
  • \\(\\* - 以(*
  • 开头
  • \\*\\) - 以*)
  • 结尾
  • [^*]* - 内部包含零个或多个非*个字符。

我还添加了|\\s+以允许一个或多个空格为分隔符(默认情况下扫描程序使用此分隔符)。


使用try-catch作为控制流程的主要部分的BTW通常被认为是错误的。相反,您应该将代码更改为

while (sc.hasNext()) {
    if(sc.hasNextInt()) {
        list.add(sc.nextInt());
    } else {
        //consume data you are not interested in 
        //so Scanner could move on to next tokens
        sc.next();
    }
}