Bash正则表达式匹配变音字符异常问题咨询
Bash正则表达式[a-z]匹配变音字符的疑问
我在Bash中使用正则表达式校验字符串是否仅包含小写a-z字符时,遇到了异常行为:grep和sed的表现一致,但Python 3.9的结果符合预期。我想知道:这是操作失误导致的吗?属于Bug吗?如果是Bug,应该向何处反馈?
测试案例
小写š被判定为属于a-z范围
[[ 'š' =~ ^[a-z]$ ]] && echo sane || echo nope sane [[ 'š' =~ [a-z] ]] && echo sane || echo nope sane grep '^[a-z]$' <<<'š' && echo sane || echo nope š sane sed 's/^[a-z]$/a/' <<<'š' a
小写ž被判定为不属于a-z范围
编辑补充:因为
ž在字母表中位于z之后,超出了a-z范围。
[[ 'ž' =~ ^[a-z]$ ]] && echo sane || echo nope nope [[ 'ž' =~ [a-z] ]] && echo sane || echo nope nope grep '^[a-z]$' <<<'ž' && echo sane || echo nope nope sed 's/^[a-z]$/a/' <<<'ž' ž
大写Š被判定为不属于a-z范围
[[ 'Š' =~ ^[a-z]$ ]] && echo sane || echo nope nope [[ 'Š' =~ [a-z] ]] && echo sane || echo nope nope grep '^[a-z]$' <<<'Š' && echo sane || echo nope nope sed 's/^[a-z]$/a/' <<<'Š' Š
大写Š被判定为属于A-Z范围
[[ 'Š' =~ ^[A-Z]$ ]] && echo sane || echo nope sane [[ 'Š' =~ [A-Z] ]] && echo sane || echo nope sane grep '^[A-Z]$' <<<'Š' && echo sane || echo nope Š sane sed 's/^[A-Z]$/A/' <<<'Š' A
环境信息
Bash版本
GNU bash, version 5.1.8(1)-release (x86_64-redhat-linux-gnu)
grep版本
grep (GNU grep) 3.6
sed版本
sed (GNU sed) 4.8
本地化设置
locale LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=
Python测试结果
python3 -c 'import re ;print("sane" if re.match(r"^[a-z]$", "š") else "nope")' nope python3 -c 'import re ;print("sane" if re.match(r"^[a-z]$", "s") else "nope")' sane
补充验证
编辑补充:有用户指出,
ž只是特殊情况,因为它在字母表中位于z之后。对于字母表中位于a-z之间的变音字符(如š和č),匹配行为一致。要排除所有这类字符,需设置LC_ALL=C。
[[ 'č' =~ ^[a-z]$ ]] && echo sane || echo nope sane LC_CTYPE=C # 或更严格的设置:LC_ALL=C [[ 'č' =~ ^[a-z]$ ]] && echo sane || echo nope nope
最终疑问
正则表达式[a-z]范围匹配变音字符是否属于预期行为?(这完全不符合我的预期。另外,我是否操作有误?这是Bug吗?如果是Bug,应向何处反馈?)
内容的提问来源于Stack Exchange,提问作者McLayn
相关产品推荐
相关产品推荐

