如何计算使用正则表达式在Java中的字符串中出现每个单词的次数?
答案 0 :(得分:6)
我认为正则表达式不能完全解决您的问题。
你想要
将一个字符串拆分成单词,正则表达式可以做一个非常简单的单词定义,“用空格或标点符号分隔的字符串部分”,即使你只是坚持下去也不是一个很好的定义英文文本
计算从步骤1派生的每个单词的出现次数。为此,您必须存储某种映射,并且正则表达式既不存储也不计数。
可行的方法可能是
如果您的输入仅限于英语,您仍然需要考虑您希望算法的行为方式,例如它们是< - >等等和复合词。添加其他语言以进行其他类型的麻烦(写同一个单词的不同方式,分成几个部分的单词,写作的差异取决于单词出现在句子中的位置等)
答案 1 :(得分:5)
我会将你的任务分成a)识别单词和b)计算文本中每个唯一单词的数量。
a)可以通过使用正则表达式分割文本来解决。 b)可以通过使用a)的结果构建地图来解决。
String text = "I like good mules. Mules are good :)";
String[] words = text.split("([\\W\\s]+)");
Map<String, Integer> counts = new HashMap<String, Integer>();
for (String word: words) {
if (counts.containsKey(word)) {
counts.put(word, counts.get(word) + 1);
} else {
counts.put(word, 1);
}
}
结果:{Mules = 1,= 1,good = 2,mules = 1,like = 1,I = 1}
答案 2 :(得分:2)
Pattern p = Pattern.compile("\\babba\\b");
Matcher m = p.matcher("abba is abba with abbabba and abba doing abba");
int count = 0;
while(m.find()){
count++;
}
System.out.println(count); //4
答案 3 :(得分:1)
使用Guava,这是一个单行:
Multiset<String> countOfEachWord =
HashMultiset.create(Splitter.on(" ").omitEmptyStrings().split(myString));
然后得到“狗”的数量,例如你会说:
countOfEachWord.count("dog")
答案 4 :(得分:0)
你必须使用正则表达式吗?如果不是这可能会有所帮助:
public static int count(final String string, final String substring)
{
int count = 0;
int idx = 0;
while ((idx = string.indexOf(substring, idx)) != -1)
{
idx++;
count++;
}
return count;
}
答案 5 :(得分:0)
int CountWords(String t){
return t.split("([[a-z][A-Z][0-9][\\Q-\\E]]+)",-1).length+(t.replaceAll("([[a-z][A-Z][0-9][\\W]]*)", "")).length()-1;
}
英文单词(化学名称)+中文单词