Использование Java Scanner Delimiter - PullRequest
       11

Использование Java Scanner Delimiter

0 голосов
/ 10 октября 2009

Я хотел бы указать разделитель для сканера, который разделяется на некоторый шаблон, но не удаляет этот шаблон из токенов. Я не могу заставить эту работу работать, поскольку все, что идентифицируется регулярным выражением, также съедается как часть разделителя. Есть предложения?

Моя конкретная проблема, у меня есть файл, который выглядит так:

text/numbers mix
numbers
numbers
text/numbers mix
numbers
numbers
numbers
.
.

Я бы хотел выделить из текста / чисел + строки до следующего текста / чисел. У меня есть регулярное выражение для их идентификации, но, как уже было сказано, использование этого в качестве разделителя съедает часть того, что я хочу.

РЕДАКТИРОВАТЬ: добавление кода:

static final String labelRegex="\\s*[^01\\s*]\\w+\\s*";
static final Pattern labelPattern = Pattern.compile(labelRegex, Pattern.MULTILINE);

- это шаблон, который я использовал для идентификации бита текста / чисел (я знаю, что мои строки чисел содержат все 1/0, разделенные пробелами).

Когда я инициализирую сканер:

stateScan = new Scanner(new BufferedReader(new FileReader(source)));
stateScan.useDelimiter(labelPattern);

, который ест метки и просто покидает ряды. В настоящее время у меня есть рабочая реализация, которая запускает два сканера на двух буферизованных считывателях файлов из одного источника, один разбивает по состояниям, а другой по меткам. Мне бы очень хотелось, чтобы это был всего лишь один ярлык + государство.

1 Ответ

5 голосов
/ 10 октября 2009

Вы можете использовать позитивный взгляд в своем регулярном выражении. Взгляд в будущее (и за спиной) не входит в матч, поэтому они не будут «съедены» сканером. Это регулярное выражение, вероятно, будет делать то, что вы хотите:

(?=text/numbers)

Разделителем будет пустая строка прямо перед подстрокой text/numbers.

Вот небольшая демонстрация:

public class Main {
    public static void main(String[] args) {
        String text = "text/numbers mix\n"+
                "numbers\n"+
                "numbers\n"+
                "text/numbers mix\n"+
                "numbers\n"+
                "numbers\n"+
                "numbers";
        String regex = "(?=text/numbers)";
        Scanner scan = new Scanner(text).useDelimiter(regex);
        while(scan.hasNext()) {
            System.out.println("------------------------");
            System.out.println(">"+scan.next().trim()+"<");
        }
    }
}

, который производит:

------------------------
>text/numbers mix
numbers
numbers<
------------------------
>text/numbers mix
numbers
numbers
numbers<
...