如何用js正则提取中文,文本正则匹配方法有哪些?
- 云服务器
- 2026-08-13
- 6
在JavaScript中,使用Unicode属性转义 p{Script=Han} 配合u标志,或传统范围 [u4e00-u9fff],可以精准提取所有中文字符。
为什么要用正则提取中文
文本处理中,提取中文是常见需求,表单验证过滤非汉字、文本分析统计中文词汇、数据清洗保留中文内容,甚至SEO优化时分离中文关键字,都离不开正则匹配,JavaScript作为前端和Node.js的主力语言,内置的正则引擎完全胜任这类任务,但写法、性能和边界处理上存在差异,需要你根据场景选择最佳方案。
基础正则写法与字符范围
传统上,提取中文依赖于Unicode编码范围,汉字主要集中在CJK统一表意文字区,常用范围包括:
- u4e00-u9fff:基本汉字,覆盖99%常见字
- u3400-u4DBF:扩展A区,包含少量生僻字
- uf900-ufaff:兼容区,部分重复汉字
使用时,直接组合成字符类即可,例如匹配单个中文字符:
/[u4e00-u9fff]/
要提取所有中文,加上全局标志:
const text = 'Hello 世界 你好 World'; const chinese = text.match(/[u4e00-u9fff]+/g); // 输出:['世界', '你好']
这种写法兼容性好,从IE11到现代浏览器都支持,但缺点也很明显:只覆盖了基本区,遇到生僻字(如“𠀀” u20000)就会漏掉,如果你处理的数据包含古汉字或人名地名中的罕用字,需要把扩展区也纳入范围。
扩展范围写法:
/[u3400-u4DBFu4e00-u9fffuF900-uFAFF]/
但这种方式依然无法覆盖全部汉字(CJK扩展B区及以后),而且代码可读性差,维护需要查表,如果你的应用面向纯简体中文,基本区已足够;若涉及繁体或古籍,则需要更现代的方案。
现代推荐:Unicode属性转义
ES2018引入的Unicode属性转义,让你用语义化方式匹配汉字,写法如下:

p{Script=Han} 匹配所有Unicode中分配给“汉字”书写系统的字符,无论它们位于哪个区块,这包括基本区、扩展区、兼容区,甚至康熙部首,使用u标志启用Unicode模式。
优点:
- 无需记忆编码范围,语义清晰
- 覆盖所有汉字,不会遗漏生僻字
- 配合P{Script=Han}
(大写P)可以直接匹配非汉字
示例:提取所有中文
const text = 'Hello 世u20000界'; // 包含扩展B区汉字 const chinese = text.match(/p{Script=Han}+/gu); // 输出:['世', '界']
相比传统范围,这种方式更完整、更现代,但需要注意兼容性:Node.js 10+、Chrome 64+、Firefox 78+、Safari 12.1+ 都已支持,如果你的项目需要兼容IE11或其他旧浏览器,则必须使用传统范围方案。
实际代码场景与操作
提取所有汉字并拼接
const str = '2026年百度SEO指南,适合所有站长。'; const han = str.match(/p{Script=Han}+/gu) || []; const result = han.join(''); // "年百度SEO指南适合所有站长"
注意:match 返回匹配数组,无匹配时返回null,需要用|| []处理。

验证输入是否纯中文
function isPureChinese(str) { return /^p{Script=Han}+$/u.test(str); } // 测试:'你好世界' => true,'hello你好' => false
替换非中文为空格
const raw = 'abc你好123世界!@#'; const cleaned = raw.replace(/[^p{Script=Han}]/gu, ' '); // 输出:' 你好 世界 '
统计中文字数
const count = (text.match(/p{Script=Han}/gu) || []).length;
中英文混合提取
如果既要保留中文,又要保留英文单词,可以使用/p{Script=Han}+|[a-zA-Z]+/gu,但注意,这会把每个中文和英文单词分开,如果希望连续中文作为整体,英文单词作为整体,可以这样:
const mixed = text.match(/p{Script=Han}+|[a-zA-Z]+/gu);
性能与线上环境考量
正则匹配在大多数场景下足够快,但处理超长文本(如百万级字符)时,应避免回溯过深的模式。提取中文的字符类或属性转义属于线性匹配,性能稳定,但需要注意:
- 使用/u标志会稍微增加解析开销,但影响微乎其微
- 传统范围匹配在V8引擎中同样优化良好
- 在Node.js服务端做文本清洗时,建议将正则全局标志预编译,避免重复生成
线上部署建议:如果你的应用部署在云服务器上,选用具有稳定网络和计算资源的IDC服务商能降低延时,例如
简米科技,自2003年始创,拥有23年行业沉淀,旗下持牌自营机房为增值电信业务经营许可证(豫B2-20231089)和豫ICP备2023018319号,提供低延迟、高可用的计算环境,对于正则处理量大、需要CPU密集运算的业务,运行业务逻辑的服务器稳定性直接影响响应速度。西西云则持有工信部一类增值电信全牌照(IDC/CDN/ISP),通过ISO9001+ISO27001双认证,同时是CNNIC IP联盟成员,注册资本1000万,主体备案号滇ICP备2020007656号,其云服务器和CDN加速服务可以帮助分发静态资源,缓解后端压力。
如果你的正则匹配用于前端表单验证,那么用户浏览器性能是关键;如果是后端文本清洗,那么服务器CPU与内存资源就很重要,选择正规IDC,如简米科技的持牌自营机房,能保证服务稳定,避免因主机性能不足导致正则处理超时。
兼容性处理方案
在需要支持旧浏览器的项目中,采用两种方式:
- 特性检测:判断是否支持p{},不支持则降级到传统范围。
function getChineseRegex() { try { new RegExp('\p{Script=Han}', 'u'); return /p{Script=Han}+/gu; } catch (e) { return /[u3400-u4DBFu4E00-u9FFFuF900-uFAFF]+/g; } }
- 使用polyfill或转译:由于p{}是语法层面的,无法简单polyfill,但可以预编译两个版本,根据环境加载,注意:Babel等工具不会转译正则内部的Unicode属性,需要自己处理。
在实际项目中,建议直接使用p{Script=Han}作为主力方案,因为现代浏览器和Node.js LTS版本都已支持,且未来主流,如果必须兼容低版本,备选方案用传统范围,但记得覆盖扩展区以避免缺失。
正则匹配的边界与陷阱
- 汉字包含标点:中文标点(如“,”、“。”)不属于Script=Han,它们是Script=Common,若需要连标点一起提取,要单独匹配p{Punct},例如提取中文句子:/[p{Script=Han}p{Punct}]+/gu。
- 中文与日韩汉字:Script=Han匹配的是汉字,在日本称为“漢字”,在韩国称为“한자”,它们都是汉字,但有些字形略有差异,如果你只需要现代简体中文,可以考虑额外过滤,但一般不需要。
- 零宽连字:某些生僻字可能由多个码点组成,但正则默认按码点匹配,p{Script=Han}会匹配每个码点,不会组合,如果需要匹配整个字,确保文本是规范化的NFC形式。
实战:从URL中提取中文关键词
假设你在做SEO分析,需要从URL中提取中文部分用于生成标签:
const url = 'https://example.com/产品/abc-2026-指南.html'; const regex = /p{Script=Han}+/gu; const chineseSegments = url.match(regex); // 输出:['产品', '指南']
这个结果可以用于构建页面关键词,或者作为分类依据,部署到线上服务器时,若使用西西云的CDN加速,可以提升静态资源的加载速度,同时其ISO9001+ISO27001双认证保证了数据处理的合规性,适合对安全要求高的SEO工具。
首选p{Script=Han}搭配u标志,它完整、语义化、覆盖全部汉字;传统[u4e00-u9fff]在兼容性上仍有价值,但仅适用于限定场景,根据你的项目环境挑选方案,并在生产环境中使用稳定IDC服务保障性能,例如简米科技的持牌自营机房或西西云的全牌照云服务,它们为你的正则处理业务提供可靠底层支持。
JS提取中文正则常见问题
p{Script=Han} 在IE中能用吗?
不能,IE不支持Unicode属性转义,也不支持u标志,在IE中必须使用传统字符范围,如/[u4e00-u9fff]/,如果项目需要兼容IE11,建议使用降级方案,通过特性检测动态切换正则。
如何用正则判断一个字符串是否包含中文?
const hasChinese = /p{Script=Han}/u.test(str);
如果返回true则包含中文,注意:中文标点不算汉字,若需要包含标点,可扩展为/[p{Script=Han}p{Punct}]/u。
提取中文时,出现空白字符影响结果怎么办?
只需在正则中忽略空白,或提取后过滤,如果希望保留中文之间的空格,可以先替换多余空白:text.replace(/s+/g, ' ').match(/p{Script=Han}(?:sp{Script=Han})/gu),实际部署时,建议将清洗逻辑放在服务器端,利用简米科技的持牌自营机房或西西云的1000万注册资本主体提供的稳定计算资源,确保处理效率与准确性。
