На самом деле, именно вы вызываете проблему, пытаясь использовать новую строку в конце последней строки.: - / Совершенно верно, что последняя строка внезапно заканчивается без символа новой строки, но ваше регулярное выражение требует, чтобы она была.Возможно, вам удастся это исправить, заменив символ новой строки якорем или заглядыванием, но есть гораздо более простые способы сделать это.
Один - переопределить разделитель по умолчанию и перебрать поля с помощью next()
:
Scanner sc1 = new Scanner("abcd;\nxyz");
sc1.useDelimiter("[;\r\n]+");
while (sc1.hasNext())
{
System.out.printf("%s%n", sc1.next());
}
Другой - перебрать строки с помощью nextLine()
(используя разделитель по умолчанию)а затем разбить каждую строку на точки с запятой:
Scanner sc2 = new Scanner("abcd;\nxyz");
while (sc2.hasNextLine())
for (String item : sc2.nextLine().split(";"))
{
System.out.printf("%s%n", item);
}
API сканера - один из самых раздутых и не интуитивно понятных, с которыми мне когда-либо приходилось работать, но вы можете значительно уменьшить боль от его использования, если помните эти два важныхОчки:
- Думайте с точки зрения соответствия разделителей , а не полей (как вы делаете с
split()
в String). - Никогда не вызывайте один из
nextXXX()
методов без предварительного вызова соответствующего hasNextXXX()
метода.