有効/無効な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]