次のコマンドを検討してください。
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: Êîðîëü è Øóò"
ちょっとした結果が期待できましたが、何も得られませんでした。
ベストアンサー1
POSIXロケールを除いて、POSIXはA-Z
類似または一致の範囲を指定しません(明確ではありません)。а-я
A-Z
а-я
[A-Z]
POSIXロケールでのみ文字のみが一致することが保証されています。ABCDEFGHIJKLMNOPQRSTUVWXYZ
他のロケールでは、実装によって動作が異なります。一部は、前後にソートされたA
すべての照合要素(文字または文字シーケンスである可能性があります)と一致することができますZ
(または含めることができますが含まれていません)。ロケールの文字セットやロケールの照合データを異なる方法で使用することもできます。文字セットにこれらのスクリプトを含む他のロケール(同じ文字セットでも)。ch
x
Á
Ź
A
Z
スクリプトのアルファベット文字を一致させるにはを使用し[[:alpha:]]
、UTF-8のコードポイントに基づいて文字の範囲を一致させるには、C.UTF-8
システムで利用可能な多くのロケールの1つを試すことができます。
ラテン文字と一致させるには、perl
またはpcre
'(、...を\p{Latin}
含む)を使用できます。存在する:é
Ê
zsh
set -o rematchpcre
[[ $x =~ '^(\p{Latin}|\p{Cyrillic})$' ]]
zsh
ラテン文字はASCII(still withとstill with rematchpcre
)の文字にのみ制限できます。
[[ $x =~ '^((?=[[:ascii:]])\p{Latin}|\p{Cyrillic})$' ]]
では有効ですが、rematchpcre
PCREとinの範囲はコードポイント値に基づいており、文字は同じコードポイントを持ち、英語のアルファベット順であることを保証するため、^([a-zA-Z]|\p{Cyrillic})$
同じ効果があります。すべてのロケールはASCIIベースとEBCDICベースのPOSIXシステムです。zsh
少なくとも。
あるいは、サブセットのみが必要な場合は、すべてのあいまいさを避けるために文字を明示的に一覧表示できます。
[[ $x =~ ^[ABC...XYZabc...xyzабв...эюя]$ ]]
いつでも次の変数に保存できます。
ascii_upper=ABC...XYZ
ascii_lower=abc...xzy
cyr_upper=...
[[ $x =~ ^[$ascii_upper$ascii_lower$cyr_upper...]$ ]]