Как заставить сканер игнорировать слова между определенным шаблоном

1

Я хочу прочитать ввод из файла с помощью сканера, но я хочу, чтобы сканер игнорировал все внутри (*....... *). Как мне это сделать? Я беру целые числа и добавляю их в список массивов, но если в тексте есть целые числа, которые я хочу игнорировать, это тоже добавляет их.

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.useelimiter("("); sc.usedelimiter(")"); Но я просто не могу заставить его работать. Благодарю!

  • 0
    все ваши входные данные имеют одинаковый шаблон? так (* 25 Los Angles в 2013 * * 4802743 верно?
  • 0
    Может ли быть какая-либо * in (*...*) часть, кроме тех, что начинаются или заканчиваются?
Показать ещё 1 комментарий
Теги:
arraylist
java.util.scanner

2 ответа

0
Лучший ответ

Кажется, что вы можете искать что-то вроде

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();
    }
}
  • 0
    нравится, но это просто извлечь 4802740
  • 0
    @KickButtowski, который, кажется, именно то, что хочет OP: « Я хочу, чтобы сканер игнорировал все внутри (* ....... *) ».
Показать ещё 7 комментариев
0

Пропустите "(* string *)" перед чтением следующего int:

try
{
    try {
        sc.skip("\\s*\\(\\*[^*]*\\*\\)");
    } catch (NoSuchElementException e) {
    }
    String temp = sc.next();
    list.add(Integer.parseInt(temp));
} catch (Exception e) {
}
  • 0
    нравится, но это просто извлечь 4802740
  • 0
    Это пропустит «Любые пробелы, а затем (* ... *)», прежде чем пытаться проанализировать следующий токен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню