zl程序教程

您现在的位置是:首页 >  其他

当前栏目

一个流传广泛的正则匹配所有中文的错误表示

2023-03-07 09:02:21 时间

在网上搜索正则表达式匹配中文的时候,通常会得到这样一个正则表达式:

\u4e00-\u9fa5
# 常用的标点符号则直接列举出来
\u3002\uff1f\uff01\uff0c\u3001\uff1b\uff1a\u201c\u201d\u2018\u2019\uff08\uff09\u300a\u300b\u3010\u3011\u007e

自己在代码里也一直是这么写的。

下午还在会议室开会的时候,群里就有同事反馈,下面这个字符串有问题:

小鹏 and (小灵狗 or 神州租车) and (三方战略 or 宁波 or P7 or 租赁 or 广州 or 杭州 or 王桐 or 蒋志春 or 残值管理 or 曾䶮冬 or 强强联合 or 战略合作 or 共赢)

一开始以为是可能该字符串包含了一些特殊的或者不可见的特殊字符,导致超出了自己正则表达式的范围,最有可能的是某些不可见字符(括号可能不是英文的,不过自己的正则里已经对中文括号做了适配),安排同事去排查。

晚上还没见反馈结果,就自己动起手来了。我把所有空格和括号删掉重新输入,问题依旧。于是用正则“\u4e00-\u9fa5”去匹配问题字符串中的中文时,发现“”这个字没有命中。

这个生僻字确实没见过,搜索了一下:

䶮是一个汉字,读作yǎn,是指飞龙在天,或者是有我无敌,唯吾独尊的意思。

(古代皇帝头脑发热给自己名字造字,却把我们带坑里了) 不过认识多一个汉字对我们解决这个问题并没有太多好处,于是搜索匹配所有汉字的正则写法,找到这个文章:https://juejin.cn/post/6844904116842430471

按照这个文章,匹配所有汉字的正则应该是:

\u4e00-\u9fff

本以为这应该是可以解决了,测试结果还是不通过。也就是说,“”这个字不在该范围中。于是查了这个字的unicode编码“4DAE”,还真就不在上述的范围!

于是搜索所有中文的unicdoe编码,这是一个正确的方向:

2E80~33FF:中日韩符号区。收容康熙字典部首、中日韩辅助部首、注音符号、日本假名、韩文音符,中日韩的符号、标点、带圈或带括符文数字、月份,以及日本的假名组合、单位、年号、月份、日期、时间等。

3400~4DFF:中日韩认同表意文字扩充A区,总计收容6,582个中日韩汉字。

4E00~9FFF:中日韩认同表意文字区,总计收容20,902个中日韩汉字。

A000~A4FF:彝族文字区,收容中国南方彝族文字和字根。

AC00~D7FF:韩文拼音组合字区,收容以韩文音符拼成的文字。

F900~FAFF:中日韩兼容表意文字区,总计收容302个中日韩汉字。

FB00~FFFD:文字表现形式区,收容组合拉丁文字、希伯来文、阿拉伯文、中日韩直式标点、小符号、半角符号、全角符号等。

(来自文章:https://blog.csdn.net/iteye_2386/article/details/81929295 ,https://www.jianshu.com/p/e39247e669ad )

于是要匹配所有中文(简体、繁体、生僻字等),直接使用下面的表达式:

\u2e80-\u9fff

不过需要说明的是,这并不是一个严格的匹配所有中文的正则表达式(会把一些日韩的字符也匹配到),不过对于我们的场景却是合适的。


真是好久没写文章了,罪过罪过。。。