Подтвердить что ты не робот

Разделение строк через регулярные выражения с помощью пунктуации и пробелов и т.д. В java

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

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

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

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

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

4b9b3361

Ответ 1

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

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
Но
Я
знать
Для
пример

слово
может
т
следует

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

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

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

\\P{L} означает не кодовую точку юникода, которая имеет свойство "Letter"

Ответ 2

Здесь есть несловный литерал, \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

Ответ 4

Try:

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

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

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