马黑黑 发表于 2023-1-26 09:32

【工具】中英字数统计

<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>

马黑黑 发表于 2023-1-26 09:34

代码
<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>


马黑黑 发表于 2023-1-26 09:52

一些说明:

—— 数字被视为单词,这是文本统计通用处理方式。数字可以是单独出现的(如:1),也是可以是像单词一样出现的(如:2974);

—— 空格统计仅处理三种类型的自然空格:小角空格、全角空格和制表符产生的空格。其他N多中非键盘自然录入的空格不予统计;

—— 标点分中英两类分开统计,但不论他们出现的位置是中文或英文。英文标点基于键盘可以自然录入的ASCII字符,中文标点基于中文标点规范;

—— 行的统计,基于自然行,包括空行在内;

—— 汉字统计,囊括全部的 20,902 个GBK汉字。超出这个GBK的汉字统计在其他双字节字符内,该统计包含但不限于汉字;

—— 单词统计,基于英文单词,包含数字。有连接符、分隔符的组词单位视为一个单词;

—— 汉语拼音统计,独立的统计分支,不包含在单词里,主要针对有声调符号的拼音,读轻声的拼音无法统计,若有会归在英文单词里;

—— 字符数:指半角和全角字符总数,含可见字符(如文本)和不可见字符(如空格、换行符);

—— 字节数:指字符总数所占用的字节数量,接近于文本存为纯文本文档占用的磁盘空间概念。

庶民来了 发表于 2023-1-26 11:20

初五快乐,兔年吉祥

马黑黑 发表于 2023-1-26 11:49

庶民来了 发表于 2023-1-26 11:20
初五快乐,兔年吉祥

{:4_191:}

红影 发表于 2023-1-26 15:17

这个统计特别全面,分的特别细致,真好{:4_199:}

红影 发表于 2023-1-26 15:18

黑黑牌的工具。太厉害了{:4_199:}

马黑黑 发表于 2023-1-26 16:10

红影 发表于 2023-1-26 15:17
这个统计特别全面,分的特别细致,真好

大致就是酱紫了,将过去在几个语言里实现的功能大概还原了。不用遍历,仅通过正则统计,还是很巧妙的

马黑黑 发表于 2023-1-26 16:11

红影 发表于 2023-1-26 15:18
黑黑牌的工具。太厉害了

一般般一般般

红影 发表于 2023-1-26 22:40

马黑黑 发表于 2023-1-26 16:10
大致就是酱紫了,将过去在几个语言里实现的功能大概还原了。不用遍历,仅通过正则统计,还是很巧妙的

简洁高效,黑黑真棒{:4_199:}

红影 发表于 2023-1-26 22:40

马黑黑 发表于 2023-1-26 16:11
一般般一般般

自己开发的,太牛了{:4_187:}

马黑黑 发表于 2023-1-26 23:33

红影 发表于 2023-1-26 22:40
自己开发的,太牛了

对文本处理算是有浓厚兴趣吧,什么JSON,MarkDown,XML,都去鼓捣鼓捣,正则既然也梳理了一遍,也弄弄

马黑黑 发表于 2023-1-26 23:35

红影 发表于 2023-1-26 22:40
简洁高效,黑黑真棒

JS部分,逻辑和算法的确不复杂,一切仰仗正则

红影 发表于 2023-1-27 21:15

马黑黑 发表于 2023-1-26 23:33
对文本处理算是有浓厚兴趣吧,什么JSON,MarkDown,XML,都去鼓捣鼓捣,正则既然也梳理了一遍,也弄弄

你说的这个几个,我全都不知道,要从头学习了{:4_173:}

红影 发表于 2023-1-27 21:16

马黑黑 发表于 2023-1-26 23:35
JS部分,逻辑和算法的确不复杂,一切仰仗正则

被黑黑说得很简单,其实很不容易{:4_187:}

马黑黑 发表于 2023-1-27 22:15

红影 发表于 2023-1-27 21:16
被黑黑说得很简单,其实很不容易

懂得正则就差不多了

马黑黑 发表于 2023-1-27 22:16

红影 发表于 2023-1-27 21:15
你说的这个几个,我全都不知道,要从头学习了

Markdown可以学一下,它使用了做笔记的,基础语法官网说不会超过10个

红影 发表于 2023-1-28 18:33

马黑黑 发表于 2023-1-27 22:15
懂得正则就差不多了

嫩,黑黑已经讲了好几堂正则的课了{:4_187:}

红影 发表于 2023-1-28 18:39

马黑黑 发表于 2023-1-27 22:16
Markdown可以学一下,它使用了做笔记的,基础语法官网说不会超过10个

谢谢黑黑,知道了{:4_187:}

马黑黑 发表于 2023-1-28 19:33

红影 发表于 2023-1-28 18:33
嫩,黑黑已经讲了好几堂正则的课了

正则挺好玩的
页: [1] 2 3 4
查看完整版本: 【工具】中英字数统计