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 个字。
上面的正则表达式工作正常,但是当连字符或下划线出现在单词之间时,例如:合作,计数返回为 2,它应该是 1。有人可以帮忙吗?
请使用内存使用量恒定的方法,而不是使用.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)
这种方法适用于(更多)常量内存:在拆分时,程序构造一个数组,这基本上是无用的,因为您从不检查数组的内容。
如果您不希望单词以连字符开头或结尾,可以使用以下正则表达式:
\w+([-]\w+)*
Run Code Online (Sandbox Code Playgroud)
这部分([-][_])*是错误的。该表示法的[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 ),所以你只需要添加-.