이 정규 표현식이 [\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]

답변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실종된 사람들이 더 눈에 띄는 것 같아요 .

관련 정보