Java 如何让扫描仪忽略特定模式之间的单词

Java 如何让扫描仪忽略特定模式之间的单词,java,arraylist,java.util.scanner,Java,Arraylist,Java.util.scanner,我想使用扫描仪从文件中读取输入,但我希望扫描仪忽略*内的所有内容。我该怎么做?我取整数并将它们添加到数组列表中,但是如果文本中有整数,我想忽略它,它也会添加这些整数 public ArrayList<Integer> readNumbers(Scanner sc) { // TODO Implement readNumbers ArrayList<Integer> list = new ArrayList<Integer&g

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

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;
    }
下面是文本文件的一行示例

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

我会将21和4802740添加到我的数组列表中。 我想用 sc.usedimiter; sc.usedimiter; 但我似乎无法让它发挥作用。
谢谢

在读取下一个int之前跳过*string*:

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

看来你可能在找类似的东西

sc.useDelimiter("\\(\\*[^*]*\\*\\)|\\s+");
此正则表达式\\\\*[^*]*\\\*\\\\\\\表示

\\\\*-以*开头, \\*\\-以* [^*]*-并在其中包含零个或多个非*字符。 我还添加了|\\s+以允许一个或多个空格作为分隔符。默认情况下,扫描仪使用此分隔符

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

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();
    }
}

你所有的输入都有相同的模式?那么2013年的*25个视角*4802743是对的吗?除了开始或结束的部分之外,*…*中是否有任何*部分?你能描述一下我想将21和4802740添加到我的数组列表中的意思吗?因为看起来21应该包含在结果中,而2013不应该。如果是这样的话,你能给我们一些逻辑来解释它吗?喜欢它,但它只是摘录而已4802740@KickButtowski这似乎正是OP想要的我希望扫描器忽略里面的一切*……*@KickButtowski我怀疑我会将21和4802740添加到数组列表中。这意味着当前不工作的代码是这样工作的,而不是OP希望有这样的结果。oh k我认为它也需要21:分割是一个选项,但同时我们也可以使用replaceAll删除不需要的区域,然后在清除的数据上使用扫描仪。OP要求扫描仪解决方案,所以我给了它。我也喜欢Scanner而不是split或replaceAll,因为hasNextInt方法可以避免繁重的try-catch块。我喜欢它,但它只提取4802740这将跳过任何空白,然后*..*在尝试分析下一个标记之前。