如何在Javascript中混合使用英文和中文进行字数统计

时间:2013-12-05 09:42:58

标签: javascript jquery character counter word-count

我想计算包含英文和中文的段落中的单词数量。对于英语,这很简单。每个单词都是一个单词。对于中文,我们将每个字符都算作一个单词。因此,香港人在这里是三个字。

因此,例如,“我是香港人”的字数应为6。

任何想法如何在Javascript / jQuery中计算它?

谢谢!

3 个答案:

答案 0 :(得分:4)

试试这样的正则表达式:

/[\u00ff-\uffff]|\S+/g

例如,"I am a 香港人".match(/[\u00ff-\uffff]|\S+/g)给出:

["I", "am", "a", "香", "港", "人"]

然后你可以检查结果数组的长度。

正则表达式的\u00ff-\uffff部分是unicode字符范围;你可能想把它缩小到你想要算作单词的字符。例如,CJK Unified将为\u4e00-\u9fcc

function countWords(str) {
    var matches = str.match(/[\u00ff-\uffff]|\S+/g);
    return matches ? matches.length : 0;
}

答案 1 :(得分:1)

它不能是6,因为当你计算一个字符串的长度时它也包含空格。 所以,

var d = "I am a 香港人";
d.length //returns 10
d.replace(/\s+/g, "").length  //returns 7, excluding spaces

仅供参考:您的网站应正确编码。

我想我找到了你需要的东西。 “我是香港人”,其中包含a重复两次。所以 在 @PSL的answer 的帮助下,我找到了一条路。

var d = "I am a 香港人";
var uniqueList=d.replace(/\s+/g, '').split('').filter(function(item,i,allItems){
    return i==allItems.indexOf(item);
}).join('');
console.log(uniqueList.length);  //returns 6

JSFiddle

当你发表评论时,我假设你在每个单词之间被称为“我是香港人”。现在我改变了代码

var d = "I am a 香 港 人";

var uniqueList=d.split(' ').filter(function(item,i,allItems){
    return i==allItems.indexOf(item);
});
console.log(uniqueList.length);  //returns 6

JSFiddle

答案 2 :(得分:1)

我已经尝试过该脚本,但是有时会错误地计算单词数。 例如,有些人会键入“香港人computing都不错的”,但脚本会将其计为4个字(使用以下脚本)。

<script>
var str = "香港人computing都不錯的";

  var matches = str.match(/[\u00ff-\uffff]|\S+/g);
    x= matches ? matches.length : 0;
    alert(x)
</script>

为解决此问题,我将代码更改为:

<script>
var str="香港人computing都不錯的";

/// fix problem in special characters such as middle-dot, etc.   
str= str.replace(/[\u007F-\u00FE]/g,' ');

/// make a duplicate first...
var str1=str;
var str2=str;

/// the following remove all chinese characters and then count the number of english characters in the string
str1=str1.replace(/[^!-~\d\s]+/gi,' ')

/// the following remove all english characters and then count the number of chinese characters in the string
str2=str2.replace(/[!-~\d\s]+/gi,'')


var matches1 = str1.match(/[\u00ff-\uffff]|\S+/g);
var matches2 = str2.match(/[\u00ff-\uffff]|\S+/g);


count1= matches1 ? matches1.length : 0;
count2= matches2 ? matches2.length : 0;

/// return the total of the mixture
var lvar1= (count1+count2);

alert(lvar1);
</script>

现在,脚本可以正确地计算中文和英文混合词的数量了。。。。