用于计算句子中单词的正则表达式

时间:2015-06-16 11:28:29

标签: java regex

public static int getWordCount(String sentence) {
    return sentence.split("(([a-zA-Z0-9]([-][_])*[a-zA-Z0-9])+)", -1).length
         + sentence.replaceAll("([[a-z][A-Z][0-9][\\W][-][_]]*)", "").length() - 1;
}

我的目的是计算一个句子中的单词数量。这个函数的输入是冗长的句子。它可能有255个单词。

  1. 这个词应该在
  2. 之间加上连字符或下划线
  3. 功能应该只计算有效单词意味着不应计算特殊字符,例如。 &安培;&安培;&安培;&安培;或者####不应算作一个单词。
  4. 上面的正则表达式工作正常,但当单词之间出现连字符或下划线时:例如:合作,计数返回为2,应该是1.有人可以帮忙吗?

3 个答案:

答案 0 :(得分:4)

请使用持续使用内存的方法,而不是使用.split.replaceAll这些非常昂贵的操作。

根据您的规格,您似乎在寻找以下正则表达式:

[\w-]+

接下来,您可以使用this approach来计算匹配数:

public static int getWordCount(String sentence) {
    Pattern pattern = Pattern.compile("[\\w-]+");
    Matcher  matcher = pattern.matcher(sentence);
    int count = 0;
    while (matcher.find())
        count++;
    return count;
}

online jDoodle demo

这种方法适用于(更多)常量内存:当拆分时,程序构造一个基本没用的数组,因为你从不检查数组的内容。

如果您不希望单词以连字符开头或结尾,可以使用以下正则表达式:

\w+([-]\w+)*

答案 1 :(得分:3)

这部分([-][_])*错了。符号[xyz]表示"括号内的任何一个字符" (见http://www.regular-expressions.info/charclass.html)。因此,您可以按顺序准确地使用字符- 完全符合字符_

修复群组使其有效:

[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*

可以使用\w

进一步简化
\w+(-\w+)*

因为\w0..9A..Za..z_http://www.regular-expressions.info/shorthand.html)匹配,因此您只需要添加{{1} }}

答案 2 :(得分:2)

如果你可以使用java 8:

long wordCount = Arrays.stream(sentence.split(" ")) //split the sentence into words   
.filter(s -> s.matches("[\\w-]+")) //filter only matching words
.count();