如何通过正则表达式区分中英文


正则表达式用了几年了,本以为这个问题很简单:把所有查询关键词中纯英文(包括数字)的滤出来;但是折腾了一下午才总算找到了以下解决方法:
iconv -f gbk -t utf-8 query_list |egrep -e "^[a-z0-9]*$"

1 为什么需要用utf-8: 如果直接对gbk编码的文字进行grep会由于编码中的交叉而滤出很多中文;
2 为什么需要用egrep: egrep=grep -E 就是正则表达式支持扩展字符集,扩展的正则支持用高八位字符;

关键:先将文本强制转换成UTF-8,然后利用egrep。
适用环境:Unix命令行模式下的grep;

有更简单的方法吗:请留言……

尝试一:
为了解决滤出字母数字查询词,先是直接grep "^[A-Za-z0-9]+$",但是总是滤出大量的中文

尝试二:
后来无意中发现使用egrep "^[a-z0-9]+$" 可以大大减少中文的量,推断关键词是GBK格式的,GBK和英文编码含有大量交叉;

尝试三:
在网上找到很多文档都是转载:使用 [\x00-\xFF] 这样的正则表达式,但是没有说明,其应用的环境是在javascript这样的环境中,js已经是将字符转换成unicode来处理了,这种环境在另外的开发环境中可能就不适用了

2007-02-18 卢亮的文章:对XML 进行 parse 时的Invalid Unicode character (0x0) 分析有更详细的阐释。


字符编码方案是从一个或多个编码字符集到一个或多个固定宽度代码单元序列的映射。最常用的代码单元是字节,但是 16 位或 32 位整数也可用于内部处理。UTF-32、UTF-16 和 UTF-8 是 Unicode 标准的编码字符集的字符编码方案。

UTF-32 即将每一个 Unicode 代码点表示为相同值的 32 位整数。很明显,它是内部处理最方便的表达方式,但是,如果作为一般字符串表达方式,则要消耗更多的内存。

UTF-16 使用一个或两个未分配的 16 位代码单元的序列对 Unicode 代码点进行编码。值 U+0000 至 U+FFFF 编码为一个相同值的 16 位单元。增补字符编码为两个代码单元,第一个单元来自于高代理范围(U+D800 至 U+DBFF),第二个单元来自于低代理范围(U+DC00 至 U+DFFF)。这在概念上可能看起来类似于多字节编码,但是其中有一个重要区别:值 U+D800 至 U+DFFF 保留用于 UTF-16;没有这些值分配字符作为代码点。这意味着,对于一个字符串中的每个单独的代码单元,软件可以识别是否该代码单元表示某个单单元字符,或者是否该代码单元是某个双单元字符的第一个或第二单元。这相当于某些传统的多字节字符编码来说是一个显著的改进,在传统的多字节字符编码中,字节值 0x41 既可能表示字母“A”,也可能是一个双字节字符的第二个字节。

UTF-8 使用一至四个字节的序列对编码 Unicode 代码点进行编码。U+0000 至 U+007F 使用一个字节编码,U+0080 至 U+07FF 使用两个字节,U+0800 至 U+FFFF 使用三个字节,而 U+10000 至 U+10FFFF 使用四个字节。UTF-8 设计原理为:字节值 0x00 至 0x7F 始终表示代码点 U+0000 至 U+007F(Basic Latin 字符子集,它对应 ASCII 字符集)。这些字节值永远不会表示其他代码点,这一特性使 UTF-8 可以很方便地在软件中将特殊的含义赋予某些 ASCII 字符。


作者:车东 发表于:2007-01-08 15:01 最后更新于:2007-04-15 19:04
版权声明:可以转载,转载时请务必以超链接形式标明文章 的原始出处和作者信息及本版权声明

引用通告

以下是前来引用的链接: 如何通过正则表达式区分中英文:

» 网站的外链/内链统计:来自Google的网站管理员工具 来自 车东[Blog^2]
Google的网站管理员工具有这样一个功能:查询相应网站的外链/内链数量和明细。从控制台,点击一个已经提交的网站:控制台 > http://www.chedong.com/blog/ > 含外部链接的网页 > 以下是导出的部分 chedong.com/blog的外链数量统计: 可惜不是按外链数量排序的,可以导出成EXCEL,报表如下: http://www.chedong.com/blog/ 17471http://www.chedong.com/blog/in... [阅读更多细节]

Comments

PHP中也可以用16进制来判断

写的好啊 学习中

ps:豆瓣在设计自己的网站的时候,特别是在修改界面,排列按钮的时候都是从用户点击数据入手的,而不是简单随意的,假艺术的任意放置。 如果想免费使用这样类似的点击数据系统,请访问http://www.2dianban.com 2点半

在文本文件里, 这个表达式可以匹配所有的英文
/[ -~]/
这个表达式可以匹配所有的非英文(比如中文)
/[^ -~]/

/是VI里用的. 你在editplus或程序里不需要/

谢谢提供这么好的信息,正在找这些信息呢,希望以后多收集点,收藏起来,学习了。

东东,很高兴看到这样的文章。但我没有看到你所说的问题,可以把你gbk编码的样本文件query_list发给我试试吗?

非常感谢!

发表一个评论

(如果你此前从未在此 Blog 上发表过评论,则你的评论必须在 Blog 主人验证后才能显示,请你耐心等候。)