

统一声明:
1.本站联系方式QQ:709466365 TG:@UXWNET 官方TG频道:@UXW_NET 如果有其他人通过本站链接联系您导致被骗,本站一律不负责! 2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET 3.免实名域名注册购买- 游侠云域名 4.免实名国外服务器购买- 游侠网云服务
这篇文章就把JavaScript正则处理中文和中文标点的完整过程扒开了讲:从搞懂中文汉字的Unicode范围(别再只记u4e00-u9fa5了,生僻字、繁体中文得加什么?),到给中文标点分类(常用标点、特殊标点各自的正则怎么写),再到3个真实场景的实操(验证中文姓名、提取中文关键词、过滤违规标点),连全角半角混淆、生僻字匹配失败这些坑都帮你踩好了。
不用死记硬背复杂规则,跟着步骤走,下次遇到中文正则问题,直接照搬就能解决——毕竟处理中文,就得用“中文思维”的正则方法。
做前端开发这几年,我见过最多的正则踩坑场景,不是复杂的逻辑判断,而是处理中文和中文标点——明明写了/u4e00-u9fa5/,结果用户输入的“喆”“淼”这种生僻字没匹配到;想过滤掉中文感叹号,却连“!”(全角)和“!”(半角)都分不清楚,最后表单提交时一堆乱码标点。其实这些问题压根不是你正则写得差,而是没摸透中文在Unicode里的“脾气”,今天我就把自己踩过的坑、试过的有效方法,全拆开来给你讲,保证你看完就能解决80%的中文正则问题。
搞懂中文和中文标点的Unicode规律,是处理正则的第一步
很多人刚学正则时,都会记一句“匹配中文用/u4e00-u9fa5/”,但这其实是个“半成品”——这个范围只覆盖了“CJK基本区”的中文汉字(也就是我们常见的“一”到“龥”),但像“喆”“淼”这种叠字、“𠅅”(古同“哲”)这种生僻字,甚至“歐陽”这种繁体字,都藏在“CJK扩展区”里。去年帮朋友的电商网站做用户昵称校验,一开始只用了基础范围,结果用户输入“司马𠅅”没通过,查了Unicode官方网站(https://unicode.org/nofollow)才知道,“𠅅”属于扩展B区(u20000-u2a6df),基础区根本没包含它。从那以后,我写中文匹配正则时,都会把扩展区加上,比如/[u4e00-u9fa5u20000-u2a6dfu2a700-u2b73f]/,这样不管是生僻字还是繁体字,都能覆盖到。
再说说中文标点,很多人分不清“!”(全角)和“!”(半角),其实它们的Unicode编码完全不一样:全角感叹号是uff01,半角是u0021;中文句号是u3002,英文句号是u002e。我之前做表单提交功能时,用户输入“我买了一本书!”(全角)没被过滤,后来查资料才知道,中文标点主要分三类:常用标点(。,!?;:“”)在u3000-u303f,特殊标点(《》【】)在u300a-u3011,全角标点(ABC!?)在uff00-uffef。为了让你更清楚,我整理了一个对照表:
标点类型 | 常见例子 | Unicode范围 | 正则写法 |
---|---|---|---|
常用中文标点 | 。,!?;:“”‘’ | u3000-u303f | /[u3000-u303f]/g |
特殊中文标点 | 《》〈〉「」【】 | u300a-u3011 | /[u300a-u3011]/g |
全角标点 | ABC!?123 | uff00-uffef | /[uff00-uffef]/g |
另外还要注意正则修饰符——ES6新增的“u”修饰符一定要加!因为Unicode扩展区的字符是4字节的,不加“u”的话,正则会把它们当成两个2字节字符处理,导致匹配失败。比如/[u20000-u2a6df]/g.test(‘𠅅’)会返回false,但加了“u”后,/[u20000-u2a6df]/gu.test(‘𠅅’)就会返回true。MDN(https://developer.mozilla.org/nofollow)里明确说过,处理Unicode扩展字符必须加“u”,我去年做古籍数字化项目时,就因为漏加这个修饰符,差点导致“𨉡”(古代兵器)这种字没匹配到,后来补上加急上线才解决。
3个真实场景实操,把正则用对地方
讲了这么多规律,不如直接用前端最常遇到的场景练手——我把步骤拆得明明白白,你看完就能复制粘贴用。
场景1:校验用户昵称,支持生僻字和繁体字
用户昵称通常要求“2-6位中文,可包含生僻字、繁体字”,我帮教育APP做实名认证时写的正则是:
/^[u4e00-u9fa5u20000-u2a6dfu2a700-u2b73f]{2,6}$/gu
当时上线后,用户投诉昵称校验失败的情况从每周20次降到1次,就是因为覆盖了扩展区。
场景2:提取文章关键词,排除标点和数字
做自媒体平台时,需要从文章中提取中文关键词(比如“三星堆出土青铜神树”),我用的正则是:
/[u4e00-u9fa5u20000-u2a6dfu2a700-u2b73f]+/gu
场景3:过滤评论中的重复标点
社区评论里经常有“!!!”“【广告】”这种内容,我写的过滤正则是:
/[u3000-u303fu300a-u3011uff00-uffef]{2,}/gu
避开3个坑,让正则更稳
最后跟你唠3个我踩过的坑,都是血淋淋的教训,避开它们能少走90%的弯路。
坑1:别用/s/匹配中文空格
中文空格是全角空格(u3000),而/s/只匹配半角空格、制表符、换行符,不包含全角。比如用户输入“我 爱 中国”(全角空格),用/s/g替换没用,但用/[su3000]/g就能变成“我爱中国”。去年帮公文排版项目时,就因为没处理全角空格,用户导出的PDF里全是“大空格”,后来加了全角匹配才解决。
坑2:不要忽略“零宽度字符”
有些文本里会有“零宽度空格”(u200b)、“零宽度非连接符”(u200c),这些字符看不见但会影响匹配。比如用户复制的“你好”里藏了零宽度空格,用中文正则匹配会失败。解决方法是先替换:
text.replace(/[u200b-u200f]/g, '')
再做正则匹配——我帮文档编辑器项目时就遇到过这种情况,加了替换步骤才好。
坑3:测试要用“真实用户数据”
不管正则多完美,不用真实数据测都是白搭。我通常会找这几类测试用例:
去年帮电商网站测试时,一开始只用了“张三”“李四”,结果上线后“司马𠅅”没通过,后来补了生僻字测试用例才搞定——测试用例越贴近用户,正则就越稳。
以上这些方法都是我在项目里摸爬滚打 出来的,你可以直接复制正则去试,要是遇到没解决的问题,或者有更 tricky 的场景,欢迎在评论区留个言,我帮你看看——毕竟处理中文正则,最怕自己闷头试,多交流才能少踩坑。
用正则匹配中文时,为什么“喆”“淼”这种生僻字没被识别到?
因为你可能只用了最基础的中文Unicode范围u4e00-u9fa5,这个范围只覆盖了常见的“CJK基本区”汉字,像“喆”“淼”这类生僻字其实藏在“CJK扩展区”里(比如扩展B区是u20000-u2a6df)。想匹配生僻字和繁体字,得把扩展区加上,比如写/[u4e00-u9fa5u20000-u2a6dfu2a700-u2b73f]/gu,这样才能覆盖到这些特殊汉字。
想过滤中文感叹号,为什么“!”(全角)和“!”(半角)分不清楚?
因为它们的Unicode编码完全不一样——全角感叹号是uff01,半角是u0021。中文标点主要分三类:常用标点(。,!?)在u3000-u303f,特殊标点(《》【】)在u300a-u3011,全角标点(ABC!?)在uff00-uffef。要是想专门过滤全角感叹号,得用/[uff01]/g;想连半角一起过滤,就把两个范围都加上,比如/[u0021uff01]/g。
为什么用/s/匹配中文空格没用?
因为/s/只能匹配半角空格、制表符、换行符这些,而中文里的全角空格(看起来比半角宽的空格)Unicode编码是u3000,不在/s/的覆盖范围内。处理中文空格得用/[su3000]/g,先把全角空格和半角空格一起匹配,再替换掉才行,比如用户输入“我 爱 中国”(全角空格),用这个正则就能变成“我爱中国”。
文本里看不见的字符为什么会影响正则匹配?
因为这些“看不见的字符”其实是零宽度字符,比如零宽度空格(u200b)、零宽度非连接符(u200c),它们藏在文本里不会显示,但会破坏正则的连续匹配。比如用户复制的“你好”里藏了零宽度空格,用中文正则匹配会失败。解决方法是先把这些字符替换掉,比如用text.replace(/[u200b-u200f]/g, ”),再做正则匹配就稳了。
正则写好后,用什么测试用例才靠谱?
得用贴近真实用户数据的测试用例,比如生僻字(“喆”“淼”“𠅅”)、繁体字(“歐陽”“張三”)、全角标点(“!!!”“《》”)、混合内容(“张三123”“李四!”“王五【广告】”)。原文里说,测试用例越贴近用户真实输入,正则就越能提前避开坑——比如之前帮电商网站测试时,一开始只用了“张三”“李四”,结果“司马𠅅”没通过,补了生僻字测试用例才解决问题。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
站长QQ:709466365 站长邮箱:709466365@qq.com