Использование useDelimiter в Java - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть файл с дефисами для даты.

Например:

Abey    F   5-5-1996    0   0   0   0
John    M   5-5-1997    10  10  10  10

https://i.imgur.com/TmGMLUg.png «пример»

Проблема, с которой я сталкиваюсь, - это попытаться напечатать все в одну строку.

Я устал:

line.useDelimiter("[\t \r]");

line.useDelimiter("-"); //to remove the hypens.

Scanner input = new Scanner(new FileReader(filename)); 
while(input.hasNextLine()) { 
        Scanner line = new Scanner(input.nextLine()); 
        line.useDelimiter("[\t \r]"); // Tab (\t) and/or space ( ) and/or carriage return (\r) delimited file
        line.useDelimiter ("-");    
        lineno++;
        System.out.println("--------READING-LINE-" + lineno + "--------");
        while(line.hasNext()) 
            System.out.println(line.next());
        line.close();

Будет напечатано

Abey
F
5
5
1996
0
0
0
0
--------READING-LINE-2--------
John
M
5
5
1997
10
10
10
10

https://i.imgur.com/jByjipO.png "ожидается"

1 Ответ

0 голосов
/ 26 апреля 2019

Я предполагаю, что вы хотите разделить на каждой вкладке, пробел, разделитель строк (вероятно, не только \r, но также \n или \r\n последовательность) И дефис -.

Первая проблема с вашим подходом состоит в том, что line.useDelimiter("-"); заменил ранее выбранный разделитель line.useDelimiter("[\t \r]");.

Вам нужно предоставить один разделитель, который объединяет обе настройки. Сложность в том, что дефис - внутри [..] будет метасимволом, который не будет представлять -, но будет указывать диапазон . Это потому, что Scanner ожидает, что регулярное выражение (регулярное выражение) сформирует разделитель, но в регулярном выражении класс символов (вещь [...]) позволяет пользователю предоставлять диапазон символов, таких как a-z ( вместо написания [abcde...z]) дефис - рассматривается как специальный символ.

Чтобы сделать его буквальным нам нужно экранировать - его внутри [..]. Для этого мы можем:

  • место \ перед ним (которое в строковых литералах нужно записать как "\\"),
  • или поместите его в положение, которое не позволит двигателю регулярного выражения рассматривать его как индикатор диапазона
    • в начале класса персонажа [-...]
    • или в конце [...-].

Но более безопасный вариант - избегать его явно с помощью "\\-", поскольку это позволит вам безопасно изменить это регулярное выражение без каких-либо сюрпризов (например, если у вас есть регулярное выражение, например [a-ek-], если вы хотите добавить z, вы бы вероятно, напишите [a-ek-z], но это не будет означать a-e ИЛИ k ИЛИ - ИЛИ z, но a-z ИЛИ k-z. Как вы видите, если у вас было [a-ek-\] добавление одной буквы z в качестве разделителя получилось бы регулярное выражение [a-ek\-z], которое мы использовали после).

Так что вы можете использовать line.useDelimiter("[\t \r\\-]");

ИЛИ также для обработки других разделителей строк, таких как \n или \r\n sequence use \R (которые нельзя использовать внутри класса символов, поскольку они не представляют только один символ, но также \r\n последовательность). Таким образом, чтобы использовать его, нам нужно было бы использовать | (оператор ИЛИ), как

line.useDelimiter("[\t \\-]|\\R");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...