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这将跳过任何空白,然后*..*在尝试分析下一个标记之前。