Дано:
"I spent eight days in Paris, France."
Нужно получить stream токенов, причем с пунктуацией.
[ 'I' , 'spent' , 'eight' , 'days' , 'in' , 'Paris' , ',' , 'France' , '.']
А если получить еще и пробелы?
[ 'I' , ' ' , 'spent' , ' ' , 'eight' , ' ' ,'days' , ' ' ,'in' , ' ' ,'Paris' , ',' , ' ' , 'France' , '.']
Возможное ли такое с core java?
Здравствуйте, ioctl, Вы писали:
I>Дано:
I>I>"I spent eight days in Paris, France."
I>
I>Нужно получить stream токенов, причем с пунктуацией.
I>I>[ 'I' , 'spent' , 'eight' , 'days' , 'in' , 'Paris' , ',' , 'France' , '.']
I>
I>А если получить еще и пробелы?
I>I>[ 'I' , ' ' , 'spent' , ' ' , 'eight' , ' ' ,'days' , ' ' ,'in' , ' ' ,'Paris' , ',' , ' ' , 'France' , '.']
I>
I>Возможное ли такое с core java?
Вот вариант навскидку, будет работать с Java 9 и выше:
List<String> tokens = new Scanner("I spent eight days in Paris, France.").findAll("\\w+|\\s|[\\,\\.]").map(match -> match.group(0)).collect(Collectors.toList());
System.out.println(tokens);
Выдаёт результат:
[I, , spent, , eight, , , , , , days, , in, , Paris, ,, , France, .]
Правда тут нужно рэгэксп настраивать для парсинга всех возможных токенов, это и плюс (гибкость регэкспа для любых твоих целей) и минус (нет готового регэкспа "из коробки"). Хороший набор юнит-тестов, покрывающий все значимые варианты, гарантирует корректность парсера. Альтернативный вариант: String.split делает аналогичную работу, но результат возвращает в виде массива, который затем можно преобразовать в стрим если очень надо.
Если все подряд идущие пробелы нужно представлять одним токеном, то пишешь \s+ вместо \s.
Здравствуйте, ioctl, Вы писали:
I>Здравствуйте, gyraboo, Вы писали:
G>>Вот вариант навскидку, будет работать с Java 9 и выше:
I>Прощелкает пунктуацию и не токенизирует пробелы.
I>Немного не то, к сожалению...
Почему же? В регэкспе же прописаны и знаки пунктуации, и пробелы.
Вот результат с \s+, тут же и знаки пунктуации и пробелы выделены в отдельные токены, тебе разве не это нужно?
[I, , spent, , eight, , days, , in, , Paris, ,, , France, .]
Здравствуйте, ioctl, Вы писали:
I>Возможное ли такое с core java?
String val = "I spent eight days in Paris, France.";
System.out.println(String.join("|", val.split("\\b")));
I| |spent| |eight| |days| |in| |Paris|, |France|.
more info on "\b":
https://www.regular-expressions.info/wordboundaries.html
Здравствуйте, ioctl, Вы писали:
i> Нужно получить stream токенов, причем с пунктуацией.
Стоит отметить, что
C++,
.NET,
pro-rata,
don't и прочий ужас — это всё слова, а не пунктуация.