[英]Regular expression for counting words in a sentence
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;
}
我的目的是计算句子中的单词数。 这个 function 的输入是冗长的句子。 它可能有 255 个单词。
上面的正则表达式工作正常,但是当单词 eg: co-operation 之间出现连字符或下划线时,返回的计数为 2,它应该是 1。有人可以帮忙吗?
请使用具有恒定内存使用量的方法,而不是使用非常昂贵的.split
和.replaceAll
。
根据您的规格,您似乎寻找以下正则表达式:
[\w-]+
接下来,您可以使用此方法计算匹配数:
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+)*
这部分([-][_])*
是错误的。 符号[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 )所以你只需要添加-
。
如果你可以使用java 8:
long wordCount = Arrays.stream(sentence.split(" ")) //split the sentence into words
.filter(s -> s.matches("[\\w-]+")) //filter only matching words
.count();
用 java 8
public static int getColumnCount(String row) {
return (int) Pattern.compile("[\\w-]+")
.matcher(row)
.results()
.count();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.