使用Java中的正则表达式计算单词数量

3
如何使用正则表达式在Java中计算字符串中每个单词出现的次数?

你能否发布一下你自己尝试过的内容?另外,如果你搜索单词 abba,并且字符串是 ABBA members didn't wear abbadabbas,那么 abba 的计数是多少?为什么要使用正则表达式? - Bart Kiers
6个回答

6
我认为正则表达式无法完全解决你的问题。
你想要:
1.将字符串拆分为单词,正则表达式可以做到这一点,但是只适用于“由空格或标点符号分隔的字符串部分”的非常简单的单词定义,即使只考虑英文文本,这也不是一个很好的定义。
2.统计从步骤1得出的每个单词的出现次数。为此,必须存储某种映射,而正则表达式既不存储也不计数。
可行的方法可能是:
1.将输入字符串(通过正则表达式或其他方式)拆分成单词字符串数组。
2.迭代该数组,并构建一个映射以计算每个单词的数量。
3.遍历映射以输出单词列表和出现次数。
如果你的输入仅限于英语,你仍然需要考虑如何处理类似they're<->they are等复合词。添加其他语言会带来更多的问题(同一个单词的不同写法、单词分成几个部分、根据单词在句子中的位置不同而有所不同的写作方式等)。

+1 还提到了语言问题,这确实有点复杂。 - Neil Coffey

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);
    }
}

结果:{骡子=1,很好=2,像=1,我=1}


2
\W 也匹配 \s:因此在字符集中不需要包括 \s - Bart Kiers

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

1

使用Guava,这是一行代码:

Multiset<String> countOfEachWord = 
   HashMultiset.create(Splitter.on(" ").omitEmptyStrings().split(myString));

then to get the count of "dog" for example you would say:

countOfEachWord.count("dog")


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;
  }

在字符串“abbabba”中计算两个“abba”,我认为这是不正确的。 - Bart Kiers
我的实际需求是: "hi hi this" hi ---> 2 this --> 1 它们是不同的单词。 - rgksugan
将“idx += substring.length”更改为修复abbabba问题。要匹配整个单词:indexOf是否接受正则表达式? - Amarghosh

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;
    }

英文单词(化学名称)+中文单词


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接