GNU grep正则表达式`[一 - 十]`(一到十)与汉字四(四)不符

时间:2012-09-29 12:07:41

标签: regex grep cjk

此命令

$ echo '一二三四五六七八九十' | grep -oE '[一-十]'

输出:

一
二
三
五
六
七
八
九
十

正则表达式[一-十](一到十个)预计与中国数字匹配。 如示例所示,除了中文字符(四个)外,它与从1到10的每个中文数字匹配。

为什么?

这是一个错误还是一个玩笑?

我可能认为这是个玩笑,因为在中文'四'(四)听起来很像'事'(事物)。事实上,在一些中文方言中,它们共享相同的发音。因此,“一二三五六七八十”(一二三五六七八九)暗示'没四'(没有四个),即'没事'(没有东西)。

BTW,我使用的grep版本:

GNU grep 2.5.4

2 个答案:

答案 0 :(得分:7)

中文数字不符合Unicode。那四是U + 56DB,而一个是U + 4E00,10是5341.所以4不适合。

阅读Unicode标准以获取更多信息,并参阅http://www.unicode.org/charts/PDF/U4E00.pdf

答案 1 :(得分:2)

我在一个中文论坛上问了这个问题,alvin_rxg回复了这个问题:

一 => U+4E00
十 => U+5341
四 => U+56DB

所以我知道我做了一个愚蠢的假设! grep并不聪明。 正则表达式[一 - 十](一到十)期望与中国数字匹配。 它只匹配'一'之间的任何字符。 (U + 4E00)和'十' (U + 5341)。 恰好所有中国人都在这个范围内,除了'四' (U + 56dB的)!

但这可以用作冷笑话。 ; - )