유효한/잘못된 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
실종된 사람들이 더 눈에 띄는 것 같아요 .