この正規表現が [\80-\BF] パターンと一致する \x63 を探すのはなぜですか。

この正規表現が [\80-\BF] パターンと一致する \x63 を探すのはなぜですか。

有効/無効なUTF-8バイトをフィルタリングしようとしていますが、次の正規表現(3バイト形式のUTF-8を処理するように設計されています)で奇妙な結果が表示されます。

私の意図はパターンですいいえテストバイトと一致し'\xE0\xA1\x63'ますが、一致します...
私は何を見逃していますか?

showmatch() {
  echo -ne "    --> "
  echo -ne "$bytes" | 
    # strip whitespace from the pattern
    perl -l -ne '/^'${1// /}'$/x and print' |
      tr -d '\n' |
        xxd -p |
          tr -d '\n'
  echo; 
}

bytes='\xE0\xA1\x63'
echo -n "before: "; echo -ne "$bytes" |xxd -p
# Note: all whitespace is stripped from each regex pattern.
#           Bytes 1 and 2 and 3
#          (---------------------------------------------------------------------------------------------------)
#              Bytes 1 and 2
#             (------------------------------------------------------------------------------)                  
#                [byt1][byt2-----]  |  [byt1][byt2-----]  |  [byte-1------------][byt2-----]      [byt3----]                                                          
#                =================     =================     ===============================      ==========                            
showmatch '(  ( ([\xE0][\xA0-\xBF]) | ([\xED][\x80-\x9F]) | ([\xE1-\xEC\xEE-\xEF][\x80-\xBF]) )  ([\80-\xBF])  )'
#
# witout spaces:
showmatch '((([\xE0][\xA0-\xBF])|([\xED][\x80-\x9F])|([\xE1-\xEC\xEE-\xEF][\x80-\xBF]))([\80-\xBF]))'
#
exit

これが出力です

before: e0a163
    --> e0a163
    --> e0a163

ベストアンサー1

x正規表現の最後の部分のanを忘れてしまったようです。

[\80-\xBF]  -->  [\x80-\xBF]

おすすめ記事