常见的正则表达式的文档都是关于英文(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. Maven灵活构建(转载)

    https://blog.csdn.net/sin90lzc/article/details/7552033

  2. LOJ-6278-数列分块入门2(分块)

    链接: https://loj.ac/problem/6278 题意: 给出一个长为 的数列,以及 个操作,操作涉及区间加法,询问区间内小于某个值 的元素个数. 思路: 分块,用vector维护每个区 ...

  3. 2019hdu多校 AND Minimum Spanning Tree

    题目链接:Click here 题目大意:两个点之间的边权为编号按位与的值,求最小生成树,方案要字典序最小 Solution: 一道不难的构造题,每个点连向他取反后的lowbit值,这样边权为0,若l ...

  4. luoguP1514 引水入城 x

    P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城 ...

  5. gdal test

    https://blog.csdn.net/hb_programmer/article/details/81807699 gdal/ogr是一个光栅和矢量地理空间数据格式的翻译库,由开源地理空间基金会 ...

  6. vue-cli 构建的 Vue 项目用 localhost 加 端口 能访问,但是切换到 ip 加 端口 就不能访问

    问题出在 webpack 的配置 在 config 文件夹下, 找到 index.js 目录, 找到如下代码 host: 'localhost', // can be overwritten by p ...

  7. QT 信号槽 异步事件驱动 单线程 多并发

    利用好Qt 模块的异步信号槽,单线程同样可是实现很强悍的的并发能力.应付正常的功能是足够的. 需要注意的是:该模式本质上为 单线程 事件驱动异步模式,所以需要做的事优化你的业务代码构架以应付性能与并发 ...

  8. JMS学习九(ActiveMQ的消息持久化到Mysql数据库)

    1.将连接Mysql数据库的jar文件,放到ActiveMQ的lib目录下 2.修改ActiveMQ的conf目录下的active.xml文件,修改数据持久化的方式 2.1  修改原来的kshadb的 ...

  9. FP AUTO节点ZPP002M执行卡住解决

    正常情况下,不到一分钟即可执行完ZPP002M节点 异常情况下,超过十分钟都没有响应 再等待只会影响FP的执行时间,影响后续的节点,解决办法是将正在执行的JOB STOP掉 再到服务器上将该节点重新执 ...

  10. mysql 时间差

    SELECT TIMESTAMPDIFF(minute,'2019-01-01 00:00:00', '2019-01-01 01:30:00') 返回结果 90 类推,有 SELECT TIMEST ...