![この正規表現が [\80-\BF] パターンと一致する \x63 を探すのはなぜですか。](https://linux33.com/image/1620/%E3%81%93%E3%81%AE%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%81%8C%20%5B%5C80-%5CBF%5D%20%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%A8%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%20%5Cx63%20%E3%82%92%E6%8E%A2%E3%81%99%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%E3%80%82.png)
有効/無効な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]
答え2
エラーが見つかりました。いいですね。今役に立つのは、同様のエラーを発見したり、今後これを防ぐ方法です。
x
正規表現にスペースを含めることができるPerlの正規表現演算子修飾子を使用しました。一致設定は改行文字で作成されます(これによりコメントを追加できます)。
/( ( ([\xE0][\xA0-\xBF]) |
([\xED][\x80-\x9F]) |
([\xE1-\xEC\xEE-\xEF][\x80-\xBF]) )
([\80-\xBF]) )/x
または、ここには括弧は必要ありません。
/([\xE0][\xA0-\xBF]|
[\xED][\x80-\x9F]|
[\xE1-\xEC\xEE-\xEF][\x80-\xBF])
[\80-\xBF] /x
x
行方不明の人がもっと目立つようです。