游侠网云服务,免实名免备案服务器 游侠云域名,免实名免备案域名

统一声明:

1.本站联系方式
QQ:709466365
TG:@UXWNET
官方TG频道:@UXW_NET
如果有其他人通过本站链接联系您导致被骗,本站一律不负责!

2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET
3.免实名域名注册购买- 游侠云域名
4.免实名国外服务器购买- 游侠网云服务
如何用JS正则处理中文和中文标点符号的详细过程

这篇文章把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,引号““””是u201Cu201D,所以要把这些区间加上(参考链接: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,然后加进正则里的,特别方便。