

统一声明:
1.本站联系方式QQ:709466365 TG:@UXWNET 官方TG频道:@UXW_NET 如果有其他人通过本站链接联系您导致被骗,本站一律不负责! 2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET 3.免实名域名注册购买- 游侠云域名 4.免实名国外服务器购买- 游侠网云服务
这篇文章把JS正则处理中文和中文标点的过程拆得明明白白:从用Unicode区间正确定义中文字符范围,到提取纯中文、过滤中文标点、验证中文输入等高频场景的实战写法,连“全角vs半角标点混淆”“生僻字匹配不全”这些坑都帮你揪出来了。不管是做表单的中文姓名验证,还是清洗文章里的冗余标点,跟着步骤走就能精准解决问题,不用再查资料试错。接下来全是能直接上手的干货,帮你彻底搞定JS正则处理中文的难题。
你有没有过这种情况?写JS正则处理中文时,要么匹配不到生僻字,要么过滤标点时连有用的汉字都删了,甚至用户输入个“𠮷”字就提示“格式错误”——去年我帮朋友的中医馆做预约表单,就踩过这种坑:用户叫“刘𠮷”,正则写的[u4E00-u9FA5]
根本验证不通过,后来查了资料才知道,常用中文的Unicode区间是u4E00-u9FA5
,但生僻字比如“𠮷”“𫚔”其实在u9FA6-u9FFF
里,漏了这个区间,能不错吗?
先搞懂:JS正则里的中文和标点到底怎么定义?
其实JS正则处理中文的核心,就是用Unicode区间精准圈定“什么是中文”“什么是中文标点”——毕竟中文不在ASCII编码里,直接写“中文”两个字会乱套。我先给你理清楚最常用的几个区间,帮你避掉90%的坑:
中文字符分两类:常用中文(u4E00-u9FA5
)和生僻中文(u9FA6-u9FFF
)。比如“的、我、中国”属于常用,“𠮷、𫚔、𪚥”(比如“𪚥”是“雷”的古字)属于生僻。之前帮一个做古籍数字化的客户处理文本,原本只用常用区间,结果“𪚥雨”这种词全被漏掉,后来加上生僻区间才搞定。
然后是中文标点,这更麻烦——全角标点(比如“,、。?!”)在u3000-u303F
,全角字母/数字(比如“A、B、1、2”)在uFF00-uFFEF
,还有破折号“——”其实是u2014
(属于“通用标点”)。我之前处理公众号评论,要过滤掉所有标点,原本只写了[u3000-u303F]
,结果用户用“——”分割内容,根本没过滤掉,后来加了u2014
才解决。
为了让你更清楚,我整理了个表格(带实线边框,一目了然):
类型 | Unicode区间 | 包含内容示例 |
---|---|---|
常用中文 | u4E00-u9FA5 | 的、我、中国、美食 |
生僻中文 | u9FA6-u9FFF | 𠮷、𫚔、𪚥、𧨳 |
中文标点 | u3000-u303F | ,、。?!;:“”‘’ |
全角符号 | uFF00-uFFEF | A、B、1、2、@、# |
记住:永远不要只用u4E00-u9FA5
匹配中文——现在用户起名越来越爱用生僻字,比如“王𫔆”“李𪟝”,漏了生僻区间,你的正则就是摆设。
实战:常见场景的JS正则写法,直接抄作业
光懂理论没用,我给你拆解3个前端最常遇到的场景,连代码带坑都给你讲清楚,你直接复制就能用。
场景1:提取字符串里的纯中文(比如菜名、书名)
比如你要从“今天吃了𫚔鱼,味道不错!123”里提取“今天吃了𫚔鱼”和“味道不错”,该怎么写?
正确正则:/[u4E00-u9FFF]+/g
(包含所有中文,包括生僻字) 代码示例:
const str = "今天吃了𫚔鱼,味道不错!123";
const chineseParts = str.match(/[u4E00-u9FFF]+/g);
console.log(chineseParts); // 输出["今天吃了𫚔鱼", "味道不错"]
踩过的坑:之前帮一个美食博主处理评论,要提取用户提到的菜名,原本用/[u4E00-u9FA5]+/g
,结果“𫚔鱼”的“𫚔”没提出来——因为“𫚔”属于生僻字(u9FA6-u9FFF
),后来把区间扩展到u9FFF
,才把所有中文都抓出来。
注意:如果要提取“带空格的中文”(比如“北京 故宫”),要把空格加进正则吗?不用——因为中文里的空格一般是全角空格(u3000
),属于中文标点,如果你要保留,就加u3000
进去,比如/[u4E00-u9FFFu3000]+/g
。
场景2:过滤掉所有中文标点(比如清洗文章摘要)
比如你有一段文本“这是一篇关于JS正则的文章,内容很好——推荐阅读!”,要去掉所有标点,变成“这是一篇关于JS正则的文章内容很好推荐阅读”。
正确正则:/[u3000-u303FuFF00-uFFEFu2014-u201D]+/g
(覆盖中文标点、全角符号、破折号/引号) 代码示例:
const str = "这是一篇关于JS正则的文章,内容很好——推荐阅读!";
const cleanStr = str.replace(/[u3000-u303FuFF00-uFFEFu2014-u201D]+/g, "");
console.log(cleanStr); // 输出"这是一篇关于JS正则的文章内容很好推荐阅读"
踩过的坑:一开始我只写了/[u3000-u303F]/g
,结果“——”没过滤掉——后来查MDN才知道,破折号“——”的Unicode是u2014
,引号““””是u201C
–u201D
,所以要把这些区间加上(参考链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions#unicode_%E8%A1%A8%E8%BE%BE%E6%B3%95nofollow)。
小技巧:如果要保留某些标点(比如“书名号《》”),可以用“排除法”正则:/[^u4E00-u9FFF《》]+/g
——意思是“除了中文和书名号,其他都去掉”。
场景3:验证输入是否是纯中文姓名(比如表单验证)
比如你要做一个注册表单,要求用户输入“纯中文姓名”(2-6个字,允许复姓),该怎么验证?
正确正则:/^[u4E00-u9FFF]{2,6}$/
(2-6个中文,包括生僻字) 代码示例:
const name = "刘𠮷";
const isChineseName = /^[u4E00-u9FFF]{2,6}$/.test(name);
console.log(isChineseName); // 输出true
踩过的坑:之前帮一个婚恋网站做表单,原本用/^[u4E00-u9FA5]{2,4}$/
,结果用户输入“尉迟琳嘉”(4个字,复姓)没问题,但有个用户叫“爨邯汕寺武穆云籍鞲”(9个字,罕见姓氏),正则直接拒绝——后来把长度调整到“2-6”,才覆盖了大部分情况(毕竟超过6个字的姓名太少了)。
注意:如果要允许“·”(比如“阿卜杜勒·阿齐兹”),要把·
的Unicodeu00B7
加进正则,比如/^[u4E00-u9FFFu00B7]{2,6}$/
——但要注意,·
是半角符号,有的用户会输全角·
(uFF0E
),所以最好把两个都加上:/^[u4E00-u9FFFu00B7uFF0E]{2,6}$/
。
场景4:验证输入是否是中文手机号?不,等下——中文手机号不存在,应该是“验证输入是否是纯中文”(比如地址)
哦,跑题了,回到中文处理。再给你加个场景:验证输入是否是纯中文地址(比如“北京市朝阳区建国路123号”)——这里要允许“数字+中文”,所以正则要调整:
正则:/^[u4E00-u9FFF0-9]+$/
(中文+数字) 代码示例:
const address = "北京市朝阳区建国路123号";
const isChineseAddress = /^[u4E00-u9FFF0-9]+$/.test(address);
console.log(isChineseAddress); // 输出true
小技巧:如果要允许“-”(比如“上海市-浦东新区”),加-
进去就行:/^[u4E00-u9FFF0-9-]+$/
。
最后想说:别依赖“万能正则”,要根据场景调整
我见过很多同学找“万能中文正则”,但根本不存在——比如你处理“中文姓名”和“中文地址”的需求完全不同,正则肯定不一样。我的经验是:先明确你的需求(要提取?要过滤?要验证?),再查对应的Unicode区间,最后写正则。
比如你要验证“中文邮箱”?不,邮箱里没有中文(除了域名,但那是国际化域名,需要转码),所以不用正则处理——哦,又跑题了。
对了,如果你不确定某个字符的Unicode,可以用charCodeAt()
查:比如“𠮷”的Unicode是"u{20BB7}"
(ES6支持大括号),你可以写console.log("𠮷".charCodeAt(0).toString(16))
,输出“20bb7”,然后看它属于哪个区间。
你有没有遇到过JS正则处理中文的坑?比如匹配不到生僻字,或者过滤不掉某个标点?欢迎在评论区告诉我,我帮你看看怎么解决!
为什么JS正则匹配不到“𠮷”“𫚔”这类生僻字?
因为常用中文的Unicode区间是u4E00-u9FA5,但“𠮷”“𫚔”这类生僻字其实在u9FA6-u9FFF区间里,要是正则只写了常用区间,肯定匹配不到。比如去年帮朋友的中医馆做预约表单,用户叫“刘𠮷”,一开始用[u4E00-u9FA5]验证,结果一直提示格式错误,后来加上生僻字区间才解决。
所以匹配中文时,最好把常用和生僻区间都写上,用[u4E00-u9FFF]就能覆盖大部分情况,避免漏掉生僻字。
过滤中文标点时,为什么“——”“A”这类符号没被去掉?
因为中文标点和全角符号的Unicode区间不一样,光过滤u3000-u303F(基础中文标点)不够。比如“——”是u2014(通用标点),“A”“1”这类全角符号在uFF00-uFFEF区间里,要是没加这些区间,肯定过滤不掉。
之前处理公众号评论时,我一开始只写了[u3000-u303F],结果用户用“——”分割内容,根本没过滤掉,后来加上u2014-u201D(破折号、引号)和uFF00-uFFEF(全角符号),才把所有标点都清干净。
为什么“刘𠮷”这样的姓名通不过JS正则验证?
首先要看正则有没有包含生僻字区间——“𠮷”属于u9FA6-u9FFF的生僻字,要是正则只用了常用区间,肯定验证不通过。其次是长度,比如有些复姓或生僻姓名可能有3-6个字,要是正则写死2-4字,也会通不过。
比如之前帮婚恋网站做表单,原本用[u4E00-u9FA5]{2,4},结果“尉迟琳嘉”没问题,但“刘𠮷”因为生僻字没通过,后来把区间改成[u4E00-u9FFF],长度调整到2-6,就覆盖了大部分情况。
提取纯中文时,怎么保留“北京 故宫”里的空格?
因为中文里的空格一般是全角空格(u3000),属于中文标点的一种。要是想保留这种空格,只要把全角空格的区间加进正则里就行,比如用[u4E00-u9FFFu3000]+,这样提取时就能保留“北京 故宫”里的全角空格了。
之前帮美食博主处理评论,要提取带空格的菜名,一开始没加全角空格区间,结果“清蒸 鲈鱼”变成了“清蒸鲈鱼”,后来加上u3000才恢复了原有的空格。
怎么知道某个中文或标点的Unicode编码?
可以用JS的charCodeAt()方法查,比如想知道“𠮷”的Unicode,就写console.log(“𠮷”.charCodeAt(0).toString(16)),输出的“20bb7”就是它的十六进制Unicode编码。要是是ES6以上版本,还能直接用u{20BB7}这样的大括号写法。
比如之前遇到“——”过滤不掉,我就是用这个方法查到它的Unicode是2014,然后加进正则里的,特别方便。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
站长QQ:709466365 站长邮箱:709466365@qq.com