Core java и токенизация
От: ioctl  
Дата: 23.06.21 11:31
Оценка:
Дано:
"I spent eight     days in Paris, France."


Нужно получить stream токенов, причем с пунктуацией.

[ 'I' , 'spent' , 'eight' , 'days' , 'in' , 'Paris' , ',' , 'France' , '.']


А если получить еще и пробелы?
[ 'I' , ' ' , 'spent' , ' ' , 'eight' ,  '     ' ,'days' , ' ' ,'in' , ' ' ,'Paris' ,  ',' , ' ' , 'France' , '.']


Возможное ли такое с core java?
Отредактировано 23.06.2021 12:13 ioctl . Предыдущая версия .
Re: Core java и токенизация
От: gyraboo  
Дата: 23.06.21 12:39
Оценка:
Здравствуйте, 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.
Отредактировано 23.06.2021 12:51 gyraboo . Предыдущая версия . Еще …
Отредактировано 23.06.2021 12:47 gyraboo . Предыдущая версия .
Отредактировано 23.06.2021 12:41 gyraboo . Предыдущая версия .
Re[2]: Core java и токенизация
От: ioctl  
Дата: 23.06.21 12:49
Оценка:
Здравствуйте, gyraboo, Вы писали:

G>Вот вариант навскидку, будет работать с Java 9 и выше:


Прощелкает пунктуацию и не токенизирует пробелы.

Немного не то, к сожалению...
Re[3]: Core java и токенизация
От: gyraboo  
Дата: 23.06.21 12:52
Оценка: 3 (1)
Здравствуйте, ioctl, Вы писали:

I>Здравствуйте, gyraboo, Вы писали:


G>>Вот вариант навскидку, будет работать с Java 9 и выше:


I>Прощелкает пунктуацию и не токенизирует пробелы.


I>Немного не то, к сожалению...


Почему же? В регэкспе же прописаны и знаки пунктуации, и пробелы.
Вот результат с \s+, тут же и знаки пунктуации и пробелы выделены в отдельные токены, тебе разве не это нужно?
[I,  , spent,  , eight,      , days,  , in,  , Paris, ,,  , France, .]
Re: Core java и токенизация
От: StanislavK Великобритания  
Дата: 23.06.21 13:14
Оценка: 5 (2)
Здравствуйте, 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
Re: Core java и токенизация
От: · Великобритания  
Дата: 24.06.21 23:14
Оценка:
Здравствуйте, ioctl, Вы писали:

i> Нужно получить stream токенов, причем с пунктуацией.

Стоит отметить, что C++, .NET, pro-rata, don't и прочий ужас — это всё слова, а не пунктуация.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.