Разделение строк через регулярные выражения с помощью пунктуации и пробелов и т.д. В java
У меня есть этот текстовый файл, который я прочитал в приложении Java, а затем подсчитал слова в нем по строкам. Прямо сейчас я разбиваю строки на слова
String.split([\\p{Punct}\\s+])"
Но я знаю, что я пропускаю некоторые слова из текстового файла. Например, слово "не может" следует разделить на два слова "может" и "т".
Запятые и другие знаки препинания должны быть полностью проигнорированы и рассматриваться как пробелы. Я пытался понять, как сформировать более точное регулярное выражение, чтобы сделать это, но я начинаю, когда дело доходит до этого, поэтому мне нужна помощь.
Что может быть лучшим регулярным выражением для той цели, которую я описал?
Ответы
Ответ 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
Ответ 3
Ну, увидев, что вы хотите считать не как два слова, попробуйте
split("\\b\\w+?\\b")
http://www.regular-expressions.info/wordboundaries.html
Ответ 4
Try:
line.split("[\\.,\\s!;?:\"]+");
or "[\\.,\\s!;?:\"']+"
Это или совпадение одного из этих символов: ., !;?:"'
(обратите внимание, что там есть пробел, но нет/или \) + приводит к тому, что несколько символов вместе считаются как.
Это должно дать вам в основном достаточную точность.
Более точные регулярные выражения нуждаются в дополнительной информации о типе текста, который вам нужен для синтаксического анализа, потому что "может быть и разделителем слов". В большинстве случаев разделители слов препинания находятся вокруг пробела, поэтому совпадение на [\\s]+
будет близким приближением. (но дает неправильный подсчет коротких цитат вроде: Она сказала: "нет".)