読み取り可能な文字のみを含む正規表現に一致する読み取り不可能な文字列

読み取り可能な文字のみを含む正規表現に一致する読み取り不可能な文字列

次のコマンドを検討してください。

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(または含めることができますが含まれていません)。ロケールの文字セットやロケールの照合データを異なる方法で使用することもできます。文字セットにこれらのスクリプトを含む他のロケール(同じ文字セットでも)。chxÁŹAZ

スクリプトのアルファベット文字を一致させるにはを使用し[[: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})$' ]]

では有効ですが、rematchpcrePCREと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...]$ ]]

おすすめ記事