正则表达式——推荐使用 Unicode 编码
常见的正则表达式的文档都是关于英文(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 编码的更多相关文章
- [转]程序员趣味读物:谈谈Unicode编码
from : http://pcedu.pconline.com.cn/empolder/gj/other/0505/616631_all.html#content_page_1 这是一篇程序员写给程 ...
- 转载:谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
转载: 谈谈Unicode编码,简要解释UCS.UTF.BMP.BOM等名词 这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级 ...
- 根据Unicode编码用C#语言把它转换成汉字的代码
rt 根据所具有的Unicode编码用C#语言把它转换成汉字的代码 var s = System.Web.HttpUtility.HtmlDecode(Utf8Str); var o = Newton ...
- 字体Unicode编码
客专家福利 有奖试读&征文——我们在互联网上奋斗的故事 10月推荐文章汇总 加入“技术热心人”,赢丰厚奖品 html-中文字体在CSS中的显示(Unicode编码) ...
- Unicode编码
Unicode为世界上所有的文字系统的每一个字符单位分配了一个唯一的整数,称为代码点,范围为:0~1114111: ASCII将每一索引映射为唯一的二进制表示,但Unicode允许多个不同二进制编码的 ...
- 推荐的PHP编码规范
推荐的PHP编码规范 发布时间: 2014-05-7 浏览次数:2754 分类: PHP教程 推荐的PHP编码规范 一 编辑器设置 1. 使用Tab缩进,不要使用空格 鉴于很多编辑器在保存文件时会自动 ...
- PHP解码unicode编码中文字符代码示例
在抓取某网站数据,结果在数据包中发现了一串编码的数据:"......\u65b0\u6d6a\u5fae\u535a......", 这其实是中文被unicode编码后了的数据,想 ...
- [百度空间] [转]程序员趣味读物:谈谈Unicode编码
出处:CSDN [ 2005-05-13 10:05:53 ] 作者:fmddlmyy 这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG ...
- GB2312、Unicode编码等
抛出问题: 我在CPP文件中,打算输出一行阿拉伯字符:
随机推荐
- phpstorm配置总结
phpstorm配合laravel框架作为项目开发,需要添加自动提示,减少查看文档的次数,本次使用的是idel-helper插件 在当前项目下 编辑composer.json文件文件,添加如下字符 & ...
- Codeforces1204C. Anna, Svyatoslav and Maps (贪心 + Floyd)
题目链接:传送门 题目大意: 给出n<=100的有向图,和路径p,求p的最短子序列v,使得依次经过v中所有点的路径为p. 思路: 题意其实就是让我们求路径上的一些关键点v,对于所有的关键点:vi ...
- Service_Worker XSS
0x00 简介 Service Worker 是 Chrome 团队提出和力推的一个 WEB API,用于给 web 应用提供高级的可持续的后台处理能力.该 WEB API 标准起草于 2013 年, ...
- zabbix简单的操作(添加主机)
zabbix是一种监控软件,我用的是centos7.5版本 Zabbix是一个基于WEB界面的提供分布式监视功能的企业级的开源解决方案. Zabbix既可以监控操作系统(Linux/Windows/A ...
- UEditor富文本编辑器简单使用
UEditor富文本编辑器简单使用 一.下载地址:https://ueditor.baidu.com/website/ 官网中并没有 python 版本的 UEditor 富文本编辑器,本文简单介绍 ...
- XGboost数据比赛实战之调参篇(完整流程)
这一篇博客的内容是在上一篇博客Scikit中的特征选择,XGboost进行回归预测,模型优化的实战的基础上进行调参优化的,所以在阅读本篇博客之前,请先移步看一下上一篇文章. 我前面所做的工作基本都是关 ...
- Docker报错解决
今天我在学习docker的时候,用docker安装nginx的时候报了如下错误: 尝试了卸载docker重装,删除nginx,删除nginx镜像文件都没有用,最后发现还是Linux和docker版本兼 ...
- C语言中time函数和localtime获取系统时间和日期
可以通过time()函数来获得计算机系统当前的日历时间(Calendar Time),处理日期时间的函数都是以本函数的返回值为基础进行运算. 1. time 函数 返回1970-1-1, 00:00: ...
- Java面试框架篇(8)
71,谈谈你对Struts的理解. 1. struts是一个按MVC模式设计的Web层框架,其实它就是一个Servlet,这个Servlet名为ActionServlet,或是ActionServle ...
- 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 ...