考虑以下命令:
STR="Êîðîëü è Øóò"; # Invalid (Russian in unrecognized encoding)
#STR="а б в г д"; # Valid (Russian)
#STR="a b c d e"; # Valid (English)
#STR="a b c d e а б в г д"; # Valid (English and Russian)
# The regex consists of latin and Russian characters
REGEX="^[a-zA-Zа-яА-Я ]+$"
if ! [[ "$STR" =~ $REGEX ]] ; then
echo "Unreadable string: ""$STR";
fi
$ echo $LC_ALL
ru_RU.UTF-8
我期望"Unreadable string: Êîðîëü è Øóò"
作为输出,但没有任何输出。
除了在POSIX语言环境中(不是,很明显),POSIX未指定喜欢A-Z
或а-я
匹配的范围。A-Z
а-я
只有在POSIX语言环境中,才能保证仅[A-Z]
在ABCDEFGHIJKLMNOPQRSTUVWXYZ
字符上匹配。
在其他语言环境中,行为在实现之间会有所不同。有些匹配可能在排序之后A
和之前排序的任何归类元素(可以是字符或字符序列)上匹配Z
(可以包括ch
,x
或Á
,但不Ź
包括),或者它们可以匹配代码点大于A
和小于的字符。是的Z
在语言环境的字符集,或者也可以在另外一个不同的方式使用的语言环境的整理数据......另外请注意,不是每个人都同意的字母(在这种情况下,像拉丁文或西里尔文)任何给定的脚本的顺序,所以你会在不同的语言环境中获得不同的行为,这些语言环境将那些脚本包含在它们的字符集中(即使它是相同的字符集))。
如果要匹配任何脚本中的任何字母字符,请使用[[:alpha:]]
,如果要基于UTF-8中的代码点匹配字符范围,则可以尝试使用C.UTF-8
许多系统上可用的语言环境。
如果你想在拉丁文字的任何字母匹配,你可以使用perl
或pcre
的\p{Latin}
(包括é
,Ê
...)。在zsh
:
set -o rematchpcre
[[ $x =~ '^(\p{Latin}|\p{Cyrillic})$' ]]
您可以将拉丁字母限制为仅在ASCII中使用的字母(仍然带有zsh
和仍然带有rematchpcre
):
[[ $x =~ '^((?=[[:ascii:]])\p{Latin}|\p{Cyrillic})$' ]]
尽管与一起生效rematchpcre
,但^([a-zA-Z]|\p{Cyrillic})$
会具有相同的效果,因为PCRE和inzsh
中的范围基于代码点值,并且保证这些字母具有相同的代码点,并且使用英文字母序列,且所有语言环境均基于ASCII和基于EBCDIC的POSIX至少系统。
或者,如果只想要一个子集,则可以显式列出字符,以避免所有歧义:
[[ $x =~ ^[ABC...XYZabc...xyzабв...эюя]$ ]]
您始终可以将它们存储在变量中,例如:
ascii_upper=ABC...XYZ
ascii_lower=abc...xzy
cyr_upper=...
[[ $x =~ ^[$ascii_upper$ascii_lower$cyr_upper...]$ ]]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句