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个单词。
上面的正则表达式工作正常,但当单词之间出现连字符或下划线时:例如:合作,计数返回为2,应该是1.有人可以帮忙吗?
答案 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;
}
这种方法适用于(更多)常量内存:当拆分时,程序构造一个基本没用的数组,因为你从不检查数组的内容。
如果您不希望单词以连字符开头或结尾,可以使用以下正则表达式:
\w+([-]\w+)*
答案 1 :(得分:3)
这部分([-][_])*
错了。符号[xyz]
表示"括号内的任何一个字符" (见http://www.regular-expressions.info/charclass.html)。因此,您可以按顺序准确地使用字符-
和完全符合字符_
。
修复群组使其有效:
[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*
可以使用\w
到
\w+(-\w+)*
因为\w
与0..9
,A..Z
,a..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();