算不了。在java中使用正则表达式的单词

时间:2010-08-27 10:51:39

标签: java regex

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

6 个答案:

答案 0 :(得分:6)

我认为正则表达式不能完全解决您的问题。

你想要

  1. 将一个字符串拆分成单词,正则表达式可以做一个非常简单的单词定义,“用空格或标点符号分隔的字符串部分”,即使你只是坚持下去也不是一个很好的定义英文文本

  2. 计算从步骤1派生的每个单词的出现次数。为此,您必须存储某种映射,并且正则表达式既不存储也不计数。

  3. 可行的方法可能是

    • 将输入字符串(通过正则表达式或其他方式)拆分为字符串数组
    • 遍历数组,并构建一个Map以保持每个单词的计数
    • 遍历地图以输出单词列表和出现次数。

    如果您的输入仅限于英语,您仍然需要考虑您希望算法的行为方式,例如它们是< - >等等和复合词。添加其他语言以进行其他类型的麻烦(写同一个单词的不同方式,分成几个部分的单词,写作的差异取决于单词出现在句子中的位置等)

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

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