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

nee*_*ena 3 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;
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 该词之间应使用连字符或下划线
  2. 函数应该只计算有效单词意味着不应该计算特殊字符,例如。&&&& 或 #### 不应算作一个单词。

上面的正则表达式工作正常,但是当连字符或下划线出现在单词之间时,例如:合作,计数返回为 2,它应该是 1。有人可以帮忙吗?

Wil*_*sem 5

请使用内存使用量恒定的方法,而不是使用.splitand.replaceAll是相当昂贵的操作。

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

[\w-]+
Run Code Online (Sandbox Code Playgroud)

接下来您可以使用这种方法来计算匹配的数量:

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;
}
Run Code Online (Sandbox Code Playgroud)

在线jDoodle演示

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

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

\w+([-]\w+)*
Run Code Online (Sandbox Code Playgroud)


usr*_*301 3

这部分([-][_])*是错误的。该表示法的[xyz]意思是“括号内的任何一个字符”(请参阅​​ http://www.regular-expressions.info/charclass.html)。因此,您可以有效地按照该顺序精确地允许 字符- 精确的字符_

修复你的组使其正常工作:

[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*
Run Code Online (Sandbox Code Playgroud)

并且可以使用进一步\w简化

\w+(-\w+)*
Run Code Online (Sandbox Code Playgroud)

因为\w匹配0..9, A..Z,a..z_( http://www.regular-expressions.info/shorthand.html ),所以你只需要添加-.