[a-z] 是如何匹配 é 的?

How did [a-z] match é?

哇,这居然匹配了 é。这里发生了什么?我希望它不匹配通常小写字母以外的任何内容。

$ echo "frappé"|egrep -E "^[a-z]+$"
frappé 

egrep(GNU grep)2.16 on Ubuntu 14.04

您的 locale 设置告诉 egrep/grep -E 如何整理 [a-z] 字符范围。

$ export LC_COLLATE=C
$ echo "frappé" | egrep '^[a-z]+$'
# no match

$ export LC_COLLATE=en_US.utf8
$ echo "frappé" | egrep '^[a-z]+$'
frappé

命名字符 类 可用于匹配带有变音符号的字符,而不管语言环境如何:

$ export LC_COLLATE=C
$ echo "frappé" | egrep '^[[:lower:]]+$'
frappé