判断汉字正则表达式更严谨方法!

一、通常做法

正如网上流传的,判断中文的正则表达式,绝大部分是这么写的(OC语言):

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",@"[\u4e00-\u9fa5]"];
/*判断是否为中文的正则表达式*/
if([predicate evaluateWithObject:name]){
   //是中文
}else{
   //不是中文
}

然而上面的正则表达式,逻辑上讲其实不太严谨:比如一些生僻字的Unicode不在0x4e00-0x9FA5之间,那么它不能正确识别出来:比如一些四叠字:

下载unicode和utf-8的转换工具,下载

如四个日的汉字,运行结果是“不是汉字”

二、原因

(假设你已经了解unicode的编码规则,和编码实现(utf-8);如果不了解,查看 字符编码的奥秘utf-8, Unicode

中国71226个汉字,分别分布在Unicode第0个平面,常用27973个,第2个平面43253个。而[\u4e00-\u9fa5]只是代表了大约20901个汉字,剩余的汉字都在第2个平面(这部分可能是生僻字,很少使用)。

三、更严谨的做法

所以,在进行正则表达式的时候需要把第二平面的汉字囊括进去。

更严谨的正则表达式应该是这样的:

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@|%@”,@“[\u4e00-\u9fa5],@“[\uDB40DC00-\uDB7FDFFF]”];

//注意这是伪代码,不能执行,很遗憾目前正则表达式不支持四个字节unicode的表示。

为什么是[\uDB40DC00-\uDB7FDFFF]:这里需要说名一下utf-16代理区:根据unicode的规则,第0平面是直接utf-8表示,第1到第16平面是通过代理区表示的。查看这里由iPhone emoji问题牵出的UTF-16编码,UTF-8编码探究——了解utf-8编码和代理区的概念。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-29 02:22:06

判断汉字正则表达式更严谨方法!的相关文章

js中如何判断汉字,以及如何计算汉字的字符长度

这是一段统计字符串(包含汉字)长度的方法: var str = '2二3三4四'; alert(getStrlen(str)) function getStrlen(str){ var json = {len:0}; var re = /[\u4e00-\u9fa5]/; 正则表达式,判断是否为汉字 for (var i = 0; i < str.length; i++) { if(re.test(str.charAt(i))){ json['len']++; } }; return json[

PHP判断移动设备来源的方法

现在移动设备大热的年代,可能我们在做web前端开发的时候经常会需要用到对移动设备的页面匹配.当然我们可以用响应式页面设计来处理前端的匹配问题,但是响应式页面只是不显示某些代码,但是还是会加载到用户的移动设备中.为了更好的照顾到用户手机浏览的体验,减少不必要的加载.我们可以再通过PHP的方式来减少用户的代码加载,提高用户浏览页面时的体验.由于现在移动设备的种类繁多.而且浏览器五花八门,所以仅仅是通过User-Agent来判断已经不能完全解决问题了. <?php function isMobile(

项目中用了汉字正则表达式,出现异常:Cannot merge new index 65993 into a non-jumbo instruction

在项目中用了汉字正则表达式,编译并运行,Eclipse控制台输出如下异常信息: Unable to execute dex: Cannot merge newindex 65993 into a non-jumbo instruction!? Conversion to Dalvikformat failed: Unable to execute dex: Cannot merge new index 65993 into anon-jumbo instruction! 解决方法: 将dex.f

文本输入框和下拉菜单特效-判断汉字的个数

————————————————————————— <script type="text/javascript">                        //进行格式校验            function sumInput(){                //获得文本框的DOM                var myText = document.getElementById("myText");                va

判断数字正则表达式

好多种方式.可以用正则表达式,可以用其他过滤方式.using System.Text.RegularExpressions;/// <summary>/// 使用指定正则进行验证/// </summary>/// <param name="regex">正则表达式</param>/// <param name="validateString">待验证字符</param>/// <retur

有关判断为空的简写方法

下面就是有关判断为空的简写方法. 代码如下 复制代码 代码如下: if (variable1 !== null || variable1 !== undefined || variable1 !== '') { var variable2 = variable1; } 上面的意思是说如果variable1不是一个空对象,或者未定义,或者不等于空字符串,那么声明一个variable2变量,将variable1赋给variable2.也就是说如果variable1存在那么就将variable1的值赋

linux中正则表达式的使用方法

大家好,欢迎你们来到我的博客,作为一个博客新手,这是我第一次发帖子,希望接下来的时间我们能够在linux的学习中互帮互助,共同进步! 好了,废话不多说,回归正题,今天我将要介绍的是非常强大的文本搜索工具--grep. grep的全称为:Globel Search Regular Expression and Printing out the line(全局搜索正则表达式并把行打印出来).它最重要的功能根据用户指定的文本模式(搜索条件)对目标文件进行逐行搜索,然后将符合要求的字符串打印出来,但必须

asp.net url址址中中文汉字参数传递乱码解决方法

中文乱码是网站开发中会常碰到的问题,今天我们来讲一下关于url址址中中文汉字参数传递乱码解决方法,有需要的朋友可以参考下.在cs文件里传参的时候用UrlEncode: Response.Redirect("B.asp教程x?Name="+Server.UrlEncode(Name)); 接参的时候用UrlDecode: Response.Write(Server.UrlDecode(Request.QueryString["Name"])); 脚本儿里传参的时候用e

(转)JavaScript中判断对象类型的种种方法

我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一个说明运算数类型的字符串.如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在). 但 type