常见的正则表达式的文档都是关于英文(ASCII字符)的,英文开发者通常也只需要处理ASCII字符,不需要处理中文这类多字符的字符。不过,依照李处ASCII字符的方式处理中文字符,就有可能出错。

  举个例子,许多文档说点号.可以匹配“除换行符\n之外的任意字符”,单这可能只适用于单字节字符,因为点号匹配的其实只是“除换行符\n之外的任意字符”而已。

  Python 2

re.search(r"^.$", "发") != None     # => false

  PHP 4.x/5.x

preg_match("/^.$/", "发");          // => 0, 表示成功匹配的次数为0

  Ruby 1.8

"发" =~ /^.$/ != nil                # => false

  之所以会出现这种情况,是因为正则表达式在匹配时“看到”的字符串是多个字符(在UTF-8编码环境下占用3个字节;在GBK编码环境下占用2个字节),于是将它们全部视为单字节字符,而没有理解这几个字节表示的是“发”;因为点号.只能匹配一个字符,结果当然不能正确匹配。要解决这个问题,必须显示指定编码,让正则表达式处理程序正确识别多字节字符,Python中的做法是在字符串的开头的引号之前写上u字符。











点号.对 Unicode 字符的匹配

字符串 正则表达式 语言 是否显示指定 Unicode 模式 可否匹配
^.$ .NET
^.$ Java 否(无须指定)
^.$ Javascript 否(无法指定) 结果取决于浏览器
/^.$/ PHP
/^.$/u PHP
^.$ Python 2
^.$ Python 3
/^.$/ Ruby 1.8
/^.$/u Ruby 1.8
/^.$/ Ruby 1.9

  注1: PHP 和 Ruby 的正则表达式本身不包含分隔符(分隔符可以有很多种,常见的是反斜线/),但 PHP 指定 Unicode 模式必须在后一个分隔符之后写u,所以在这里将分隔符也写出来。

  注2:Python 2 中虽然提供了 Unicode 模式,但即便采用这种模式,点号.仍然不能匹配多字节字符,出非显示指定为 Unicode 字符串(在 Python 2,默认是 ASCII 字符串)

  注3:Ruby 1.9 在不同平台想的变现不一样,经过作者测试,在 Linux 下采用 Unicode 匹配规则,而 Mac 和 Windows 的情况通常是采用 ASCII 匹配规则。

  现在再来解释,虽然 GBK 编码也是多字节编码,为什么不推荐使用:常见的中文字符编码有 GBK 和 Unicode 两种, GBK 编码使用确实也很多(尤其是在 Windows 平台上),但如果需要使用正则表达式处理中文,我强烈推荐使用 Unicode 字符。这样的选择的最重要的原因是,正则表达式处理程序一般只能准确识别 Unicode 字符的边界

  举例来说:要求匹配“收”(GBK编码是ca d5)或者“发”(GBK编码是b7 a2),很自然会想到使用字符组[收发]。这个思路是对的,但从例 7-4 可以看到,即便采用GBK编码,正则表达式处理程序仍然不能识别出“2个字符节字符构成的字符组”,而将其视为“4个单字符字节构成的字符组”,其值分别为202、213、183、162,换算成十六进制,正好是“收”和“发”对应的ca、d5和b7、a2.用它来匹配没有指定Unicode编码的字符“罚”(它的GBK编码是b7 a3,也解释十进制的183 163),就会产生错误——虽然“罚”字既不等于“收”也不等于“发”,但码值为b7的这个单字符字符可以匹配!





正则表达式——推荐使用 Unicode 编码的更多相关文章

  1. [转]程序员趣味读物:谈谈Unicode编码

    from : http://pcedu.pconline.com.cn/empolder/gj/other/0505/616631_all.html#content_page_1 这是一篇程序员写给程 ...

  2. 转载:谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词

    转载: 谈谈Unicode编码,简要解释UCS.UTF.BMP.BOM等名词 这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级 ...

  3. 根据Unicode编码用C#语言把它转换成汉字的代码

    rt 根据所具有的Unicode编码用C#语言把它转换成汉字的代码 var s = System.Web.HttpUtility.HtmlDecode(Utf8Str); var o = Newton ...

  4. 字体Unicode编码

    客专家福利     有奖试读&征文——我们在互联网上奋斗的故事      10月推荐文章汇总      加入“技术热心人”,赢丰厚奖品 html-中文字体在CSS中的显示(Unicode编码) ...

  5. Unicode编码

    Unicode为世界上所有的文字系统的每一个字符单位分配了一个唯一的整数,称为代码点,范围为:0~1114111: ASCII将每一索引映射为唯一的二进制表示,但Unicode允许多个不同二进制编码的 ...

  6. 推荐的PHP编码规范

    推荐的PHP编码规范 发布时间: 2014-05-7 浏览次数:2754 分类: PHP教程 推荐的PHP编码规范 一 编辑器设置 1. 使用Tab缩进,不要使用空格 鉴于很多编辑器在保存文件时会自动 ...

  7. PHP解码unicode编码中文字符代码示例

    在抓取某网站数据,结果在数据包中发现了一串编码的数据:"......\u65b0\u6d6a\u5fae\u535a......", 这其实是中文被unicode编码后了的数据,想 ...

  8. [百度空间] [转]程序员趣味读物:谈谈Unicode编码

    出处:CSDN [ 2005-05-13 10:05:53 ] 作者:fmddlmyy 这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG ...

  9. GB2312、Unicode编码等

    抛出问题: 我在CPP文件中,打算输出一行阿拉伯字符:

随机推荐

  1. phpstorm配置总结

    phpstorm配合laravel框架作为项目开发,需要添加自动提示,减少查看文档的次数,本次使用的是idel-helper插件 在当前项目下 编辑composer.json文件文件,添加如下字符 & ...

  2. Codeforces1204C. Anna, Svyatoslav and Maps (贪心 + Floyd)

    题目链接:传送门 题目大意: 给出n<=100的有向图,和路径p,求p的最短子序列v,使得依次经过v中所有点的路径为p. 思路: 题意其实就是让我们求路径上的一些关键点v,对于所有的关键点:vi ...

  3. Service_Worker XSS

    0x00 简介 Service Worker 是 Chrome 团队提出和力推的一个 WEB API,用于给 web 应用提供高级的可持续的后台处理能力.该 WEB API 标准起草于 2013 年, ...

  4. zabbix简单的操作(添加主机)

    zabbix是一种监控软件,我用的是centos7.5版本 Zabbix是一个基于WEB界面的提供分布式监视功能的企业级的开源解决方案. Zabbix既可以监控操作系统(Linux/Windows/A ...

  5. UEditor富文本编辑器简单使用

    UEditor富文本编辑器简单使用 一.下载地址:https://ueditor.baidu.com/website/ 官网中并没有 python 版本的 UEditor 富文本编辑器,本文简单介绍 ...

  6. XGboost数据比赛实战之调参篇(完整流程)

    这一篇博客的内容是在上一篇博客Scikit中的特征选择,XGboost进行回归预测,模型优化的实战的基础上进行调参优化的,所以在阅读本篇博客之前,请先移步看一下上一篇文章. 我前面所做的工作基本都是关 ...

  7. Docker报错解决

    今天我在学习docker的时候,用docker安装nginx的时候报了如下错误: 尝试了卸载docker重装,删除nginx,删除nginx镜像文件都没有用,最后发现还是Linux和docker版本兼 ...

  8. C语言中time函数和localtime获取系统时间和日期

    可以通过time()函数来获得计算机系统当前的日历时间(Calendar Time),处理日期时间的函数都是以本函数的返回值为基础进行运算. 1. time 函数 返回1970-1-1, 00:00: ...

  9. Java面试框架篇(8)

    71,谈谈你对Struts的理解. 1. struts是一个按MVC模式设计的Web层框架,其实它就是一个Servlet,这个Servlet名为ActionServlet,或是ActionServle ...

  10. luogu 4725 【模板】多项式对数函数(多项式 ln)

    $G(x)=ln(A(x))$ $G'(x)=ln'(A(x))A'(x)=\frac{A'(x)}{A(x)}$     由于求导和积分是互逆的,所以对 $G$ 求积分,即 $G(x)=\int\f ...