Разделение строк по регулярным выражениям с помощью знаков препинания, пробелов и т. Д. В Java - PullRequest
21 голосов
/ 12 сентября 2011

У меня есть этот текстовый файл, который я читаю в приложение Java, а затем подсчитываю слова в нем построчно.Прямо сейчас я разделяю строки на слова на

String.split([\\p{Punct}\\s+])"

Но я знаю, что мне не хватает некоторых слов из текстового файла.Например, слово «не может» следует разделить на два слова «можно» и «т».

Запятые и другие знаки препинания следует полностью игнорировать и рассматривать как пробел.Я пытался понять, как создать более точное Регулярное выражение, чтобы сделать это, но я новичок, когда дело доходит до этого, поэтому мне нужна помощь.

Что может быть лучшим регулярным выражением для моей цели?описал?

Ответы [ 4 ]

20 голосов
/ 12 сентября 2011

У вас есть одна маленькая ошибка в вашем регулярном выражении.Попробуйте это:

String[] Res = Text.split("[\\p{Punct}\\s]+");

[\\p{Punct}\\s]+ переместите форму + внутри класса персонажа наружу.В противном случае вы разделяете также на + и не объединяете символы разделения подряд.

Так я получаю для этого кода

String Text = "But I know. For example, the word \"can\'t\" should";

String[] Res = Text.split("[\\p{Punct}\\s]+");
System.out.println(Res.length);
for (String s:Res){
    System.out.println(s);
}

этот результат

10
Но
Я
знаю
Для
Например
*
слово
может
t
должно

Что должно соответствовать вашему требованию.

В качестве альтернативы вы можете использовать

String[] Res = Text.split("\\P{L}+");

\\P{L} означает, что это не кодовая точка Unicode со свойством "Буква"

10 голосов
/ 12 сентября 2011

Существует не-словесный литерал, \W, см. Pattern.

String line = "Hello! this is a line. It can't be hard to split into \"words\", can it?";
String[] words = line.split("\\W+");
for (String word : words) System.out.println(word);

дает

Hello
this
is
a
line
It
can
t
be
hard
to
split
into
words
can
it
0 голосов
/ 12 сентября 2011

Попробуйте:

line.split("[\\.,\\s!;?:\"]+");
or         "[\\.,\\s!;?:\"']+"

Это или соответствует одному из следующих символов: ., !;?:"' (обратите внимание, что там есть пробел, но нет / или \), + вызывает несколько символов вместе, чтобыбыть посчитанным как один.

Это должно дать вам в основном достаточную точность.Для более точных регулярных выражений потребуется больше информации о типе текста, который необходимо проанализировать, поскольку он также может быть разделителем слов.Чаще всего разделители слов пунктуации располагаются вокруг пробела, поэтому совпадение на [\\s]+ также будет близким приближением.(но неверно рассчитывает короткие цитаты, такие как: «Нет».)

0 голосов
/ 12 сентября 2011

Ну, видя, что вы хотите считать не можете как два слова, попробуйте

split("\\b\\w+?\\b")

http://www.regular -expressions.info / wordboundaries.html

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