匹配中文的正则表达式

于项目中使用了i18n,所以在代码中,就得相应的为那些中文字符加上gettext的标记。但是一个问题是,有太多的文件需要修改,特别是那些嵌在HTML中的汉字,在大段大段的文字中相当的不起眼。那怎么办呢?这个时候很自然的就想到了grep。

我们的文件都是使用UTF-8的格式储存的。上网查了一会儿资料,发现UTF-8编码中中文编码在\u4e00-\u9fa5这段区间之内。那么一个很自然的想法就是使用

grep [\u4e00-\u9fa5] -r <目录>

来实现。但是结果很令人失望,什么都没有找出来。在emacs下也作了相应测试,奇怪的是,[\u4e00-\u9fa5]找出的是所有非中文字符而[^\u4e00-\u9fa5]却找出了非英文字符。Google了许久,也一直没有找到解释。

那么怎么办呢?一个权宜之计是根据当前我们文件的内容做定制,由于文件中的符号包括英文字符、标点符号和中文字符,那么使用排除法应该可以达到要求。尝试了一下,确实使用如下的正则在emacs中和grep中都能找出我们所需要的中文:

grep [^0-9a-zA-Z[:space:][:punct:]] -r <目录>

最后还想作一下简化,由于ASCII中字母和单词是按照0-9A-Za-z的顺序来排布的,所以这个正则表达式应该能够简化为[^0-z[:space:][:punct:]]。可是在实际使用中,只有将小写的z换成大写的Z才能使grep正常工作,而emacs里不论小写大写都无所谓,反正也都是相当奇怪的。

现在这个解决办法并不完美,因为并不是严格匹配中文编码区间的,如果文件中出现其他语言的Unicode文字就没有用了。所以还是需要寻找一个办法能在正则中寻找UTF-8字符的办法。如果有谁有这方面的经验,请在评论上踩上一脚,大家一起探讨一下。:)