【工具】中英字数统计
<style>#papa {
margin: auto;
width: 740px;
font: normal 16px sans-serif;
color: #000;
}
#papa > h2 { text-align: center; }
#papa > p { margin: 10px 0; }
#txtbox {
width: 100%;
height: 560px;
padding: 12px;
box-sizing: border-box;
font: normal 16px sans-serif;
}
#result {
font: normal 15px/20px monospace;
}
</style>
<div id="papa">
<h2>中英字数统计</h2>
<textarea id="txtbox"></textarea>
<p><input id="okey" type="button" value="统计"/></p>
<pre id="result"></pre>
</div>
<script>
let calcwords = (str) => {
//str = str.trim();
let reg_all = /(.|\n)/g, //所有字符
reg_bytebj = /[\x00-\xff]/g, //所有半角字符
reg_char = /\w/g, //所有 \w 字节
reg_space = /[\u0009\u0020\u3000]/g,
reg_word = /\b\w+\b/gm, //英文单词
reg_link = /\w+[-']\w+/g, //英文单词连接符
reg_links = /\w+[-']\w+[-']\w+/g, //单词内出现多符号
reg_py = /*[āáǎàōóǒòēéěèīíǐìūúǔùüǖǘǚǜńň??]*/gi, //汉语拼音
reg_hanz = /[一-龥]/g, //GBK汉字
reg_hanzbd = /[\u3002\uff1f\uff01\uff0c\u3001\uff1b\uff1a\u300c\u300d\u300e\u300f\u2018\u2019\u201c\u201d\uff08\uff09\u3014\u3015\u3010\u3011\u2014\u2026\u2013\uff0e\u300a\u300b\u3008\u3009]/g,
reg_enbd = /[\u0021-\u0029\u002a-\u002f\u003a-\u003f\u0040\u005b-\u005f\u0060\u007b-\u007e]/g, //英文标点
reg_dblbyte = /[^\x00-\xff]/g; //所有非ASCII字符
let num_all = reg_all.test(str) ? str.match(reg_all).length : 0; //全部字符数
let num_bytebj = reg_bytebj.test(str) ? str.match(reg_bytebj).length : 0; //半角字符
let num_py = reg_py.test(str) ? str.match(reg_py).length : 0; //汉语拼音
if(num_py > 0) str = str.replace(reg_py,'');
let num_char = reg_char.test(str) ? str.match(reg_char).length : 0; //\w单词字符
let num_space = reg_space.test(str) ? str.match(reg_space).length : 0; //空格
let num_word = reg_word.test(str) ? str.match(reg_word).length : 0; //正则单词
let num_link = reg_link.test(str) ? str.match(reg_link).length : 0; //英文单连字符
let num_links = reg_links.test(str) ? str.match(reg_links).length : 0; //英文多连字符
let num_hanz = reg_hanz.test(str) ? str.match(reg_hanz).length : 0; //GBK汉字
let num_hanzbd = reg_hanzbd.test(str) ? str.match(reg_hanzbd).length: 0; //汉语标点符号
let num_enbd = reg_enbd.test(str) ? str.match(reg_enbd).length : 0; //英文标点
let num_dblbyte = reg_dblbyte.test(str) ? str.match(reg_dblbyte).length : 0; //多字节字符
let num_line = str.split('\n').length; //行数
return {
all: num_all + num_line - 1, //字符数
bytes: num_bytebj + num_dblbyte * 2 + num_line - 1, //字节数
en: num_word - num_link - num_links, //英文单词
en_bd: num_enbd - num_link - num_links, //英文标点
cn: num_hanz, //GBK汉字
cn_bd: num_hanzbd, //汉语标点
py: num_py, //汉语拼音
space: num_space, //空格
line: num_line, //行
other: num_dblbyte - num_hanz - num_hanzbd, //其他双字节字符
};
};
okey.onclick = () => {
let O = calcwords(txtbox.value);
result.innerText = `字符数 ${O.all}
字节数 ${O.bytes}
行 ${O.line}
汉字 ${O.cn}
单词 ${O.en}
其他 中文标点 ${O.cn_bd}
英文标点 ${O.en_bd}
其他双字节字符 ${O.other}
汉语拼音 ${O.py}
空格 ${O.space}
`;
}
</script>
代码
<style>
#papa {
margin: auto;
width: 740px;
font: normal 16px sans-serif;
color: #000;
}
#papa > h2 { text-align: center; }
#papa > p { margin: 10px 0; }
#txtbox {
width: 100%;
height: 560px;
padding: 12px;
box-sizing: border-box;
font: normal 16px sans-serif;
}
#result {
font: normal 15px/20px monospace;
}
</style>
<div id="papa">
<h2>中英字数统计</h2>
<textarea id="txtbox"></textarea>
<p><input id="okey" type="button" value="统计"/></p>
<pre id="result"></pre>
</div>
<script>
let calcwords = (str) => {
//str = str.trim();
let reg_all = /(.|\n)/g, //所有字符
reg_bytebj = /[\x00-\xff]/g, //所有半角字符
reg_char = /\w/g, //所有 \w 字节
reg_space = /[\u0009\u0020\u3000]/g,
reg_word = /\b\w+\b/gm, //英文单词
reg_link = /\w+[-']\w+/g, //英文单词连接符
reg_links = /\w+[-']\w+[-']\w+/g, //单词内出现多符号
reg_py = /*[āáǎàōóǒòēéěèīíǐìūúǔùüǖǘǚǜńň??]*/gi, //汉语拼音
reg_hanz = /[一-龥]/g, //GBK汉字
reg_hanzbd = /[\u3002\uff1f\uff01\uff0c\u3001\uff1b\uff1a\u300c\u300d\u300e\u300f\u2018\u2019\u201c\u201d\uff08\uff09\u3014\u3015\u3010\u3011\u2014\u2026\u2013\uff0e\u300a\u300b\u3008\u3009]/g,
reg_enbd = /[\u0021-\u0029\u002a-\u002f\u003a-\u003f\u0040\u005b-\u005f\u0060\u007b-\u007e]/g, //英文标点
reg_dblbyte = /[^\x00-\xff]/g; //所有非ASCII字符
let num_all = reg_all.test(str) ? str.match(reg_all).length : 0; //全部字符数
let num_bytebj = reg_bytebj.test(str) ? str.match(reg_bytebj).length : 0; //半角字符
let num_py = reg_py.test(str) ? str.match(reg_py).length : 0; //汉语拼音
if(num_py > 0) str = str.replace(reg_py,'');
let num_char = reg_char.test(str) ? str.match(reg_char).length : 0; //\w单词字符
let num_space = reg_space.test(str) ? str.match(reg_space).length : 0; //空格
let num_word = reg_word.test(str) ? str.match(reg_word).length : 0; //正则单词
let num_link = reg_link.test(str) ? str.match(reg_link).length : 0; //英文单连字符
let num_links = reg_links.test(str) ? str.match(reg_links).length : 0; //英文多连字符
let num_hanz = reg_hanz.test(str) ? str.match(reg_hanz).length : 0; //GBK汉字
let num_hanzbd = reg_hanzbd.test(str) ? str.match(reg_hanzbd).length: 0; //汉语标点符号
let num_enbd = reg_enbd.test(str) ? str.match(reg_enbd).length : 0; //英文标点
let num_dblbyte = reg_dblbyte.test(str) ? str.match(reg_dblbyte).length : 0; //多字节字符
let num_line = str.split('\n').length; //行数
return {
all: num_all + num_line - 1, //字符数
bytes: num_bytebj + num_dblbyte * 2 + num_line - 1, //字节数
en: num_word - num_link - num_links, //英文单词
en_bd: num_enbd - num_link - num_links, //英文标点
cn: num_hanz, //GBK汉字
cn_bd: num_hanzbd, //汉语标点
py: num_py, //汉语拼音
space: num_space, //空格
line: num_line, //行
other: num_dblbyte - num_hanz - num_hanzbd, //其他双字节字符
};
};
okey.onclick = () => {
let O = calcwords(txtbox.value);
result.innerText = `字符数 ${O.all}
字节数 ${O.bytes}
行 ${O.line}
汉字 ${O.cn}
单词 ${O.en}
其他 中文标点 ${O.cn_bd}
英文标点 ${O.en_bd}
其他双字节字符 ${O.other}
汉语拼音 ${O.py}
空格 ${O.space}
`;
}
</script>
一些说明:
—— 数字被视为单词,这是文本统计通用处理方式。数字可以是单独出现的(如:1),也是可以是像单词一样出现的(如:2974);
—— 空格统计仅处理三种类型的自然空格:小角空格、全角空格和制表符产生的空格。其他N多中非键盘自然录入的空格不予统计;
—— 标点分中英两类分开统计,但不论他们出现的位置是中文或英文。英文标点基于键盘可以自然录入的ASCII字符,中文标点基于中文标点规范;
—— 行的统计,基于自然行,包括空行在内;
—— 汉字统计,囊括全部的 20,902 个GBK汉字。超出这个GBK的汉字统计在其他双字节字符内,该统计包含但不限于汉字;
—— 单词统计,基于英文单词,包含数字。有连接符、分隔符的组词单位视为一个单词;
—— 汉语拼音统计,独立的统计分支,不包含在单词里,主要针对有声调符号的拼音,读轻声的拼音无法统计,若有会归在英文单词里;
—— 字符数:指半角和全角字符总数,含可见字符(如文本)和不可见字符(如空格、换行符);
—— 字节数:指字符总数所占用的字节数量,接近于文本存为纯文本文档占用的磁盘空间概念。 初五快乐,兔年吉祥
庶民来了 发表于 2023-1-26 11:20
初五快乐,兔年吉祥
{:4_191:} 这个统计特别全面,分的特别细致,真好{:4_199:} 黑黑牌的工具。太厉害了{:4_199:} 红影 发表于 2023-1-26 15:17
这个统计特别全面,分的特别细致,真好
大致就是酱紫了,将过去在几个语言里实现的功能大概还原了。不用遍历,仅通过正则统计,还是很巧妙的 红影 发表于 2023-1-26 15:18
黑黑牌的工具。太厉害了
一般般一般般 马黑黑 发表于 2023-1-26 16:10
大致就是酱紫了,将过去在几个语言里实现的功能大概还原了。不用遍历,仅通过正则统计,还是很巧妙的
简洁高效,黑黑真棒{:4_199:} 马黑黑 发表于 2023-1-26 16:11
一般般一般般
自己开发的,太牛了{:4_187:} 红影 发表于 2023-1-26 22:40
自己开发的,太牛了
对文本处理算是有浓厚兴趣吧,什么JSON,MarkDown,XML,都去鼓捣鼓捣,正则既然也梳理了一遍,也弄弄 红影 发表于 2023-1-26 22:40
简洁高效,黑黑真棒
JS部分,逻辑和算法的确不复杂,一切仰仗正则 马黑黑 发表于 2023-1-26 23:33
对文本处理算是有浓厚兴趣吧,什么JSON,MarkDown,XML,都去鼓捣鼓捣,正则既然也梳理了一遍,也弄弄
你说的这个几个,我全都不知道,要从头学习了{:4_173:} 马黑黑 发表于 2023-1-26 23:35
JS部分,逻辑和算法的确不复杂,一切仰仗正则
被黑黑说得很简单,其实很不容易{:4_187:} 红影 发表于 2023-1-27 21:16
被黑黑说得很简单,其实很不容易
懂得正则就差不多了 红影 发表于 2023-1-27 21:15
你说的这个几个,我全都不知道,要从头学习了
Markdown可以学一下,它使用了做笔记的,基础语法官网说不会超过10个 马黑黑 发表于 2023-1-27 22:15
懂得正则就差不多了
嫩,黑黑已经讲了好几堂正则的课了{:4_187:} 马黑黑 发表于 2023-1-27 22:16
Markdown可以学一下,它使用了做笔记的,基础语法官网说不会超过10个
谢谢黑黑,知道了{:4_187:} 红影 发表于 2023-1-28 18:33
嫩,黑黑已经讲了好几堂正则的课了
正则挺好玩的