Perl의 유니코드 문자열에서 완전히 구성된 문자만 일치시키려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/203605

문제

유니코드 문자열에서 완전히 구성된 문자만 일치시키는 방법을 찾고 있습니다.

~이다 [:print:] 이 문자 클래스를 통합하는 정규식 구현의 로케일에 따라 달라지나요?예를 들어 일본어 문자 'あ'는 제어 문자가 아니기 때문에 일치합니까? [:print:] 항상 ASCII 코드 0x20~0x7E가 될까요?

Perl RE를 포함하여 제어 문자 이외의 다른 문자와 일치시키는 데 사용할 수 있는 문자 클래스가 있습니까?만약에 [:print:] 내가 가정하는 ASCII 범위의 문자만 포함됩니다. [:cntrl:] 너무 그렇습니다.

도움이 되었습니까?

해결책

echo あ| perl -nle 'BEGIN{binmode STDIN,":utf8"} print"[$_]"; print /[[:print:]]/ ? "YES" : "NO"'

이것은 대부분 작동하지만 넓은 캐릭터에 대한 경고를 생성합니다. 그러나 그것은 당신에게 아이디어를 제공합니다 : 당신은 실제 유니 코드 문자열을 다루고 있는지 확인해야합니다 (UTF8 :: IS_UTF8 확인). 또는 그냥 확인하십시오 perlunicode 전혀 - 전체 피사체가 여전히 내 머리를 회전시킵니다.

다른 팁

나는 당신이 그것을 위해 로케일을 원하거나 필요로 하지 않고 오히려 유니코드를 원한다고 생각합니다.텍스트 문자열을 디코딩한 경우, \w 모든 언어의 단어 문자와 일치합니다. \d 일치뿐만 아니라 0..9 하지만 모든 유니코드 숫자 등정규식에서는 다음을 사용하여 유니코드 속성을 쿼리할 수 있습니다. \p{PropertyName}.특히 당신에게 흥미로운 것은 \p{Print}. 사용 가능한 모든 유니코드 문자 속성 목록은 다음과 같습니다..

나는 썼다 유니코드와 Perl의 기본과 미묘함에 관한 기사, 이는 Perl이 문자열을 단지 바이트 시퀀스가 ​​아닌 문자 시퀀스로 인식하도록 하기 위해 무엇을 해야 하는지에 대한 좋은 아이디어를 제공해야 합니다.

업데이트:유니코드를 사용하면 언어에 따른 동작이 발생하지 않지만 대신 언어에 관계없이 정상적인 기본값이 적용됩니다.이것은 당신이 원하는 것일 수도 있고 아닐 수도 있지만 인쇄 가능/제어 문자의 구별을 위해 언어 의존적 행동이 필요한 이유를 알 수 없습니다.

\X 완전히 구성된 문자 (시퀀스)와 일치합니다. 증거:

#!/usr/bin/env perl
use 5.010;
use utf8;
use Encode qw(encode_utf8);

for my $string (qw(あ ご ご), "\x{3099}") {
    say encode_utf8 sprintf "%s $string", $string =~ /\A \X \z/msx ? 'ok' : 'nok';
}

테스트 데이터는 다음과 같습니다. 정상적인 문자, 사전 흡착 된 문자, 결합 문자 시퀀스 및 결합 문자 (자체적으로 "계산되지 않음", 유니 코드 3 장의 단순화)입니다.

대리자 \X ~와 함께 [[:print:]] Tanktalus의 답변이 마지막 두 경우에 대해 잘못된 일치를 생성합니다.

예, 이러한 표현은 로케일의 종속입니다.

항상 캐릭터 클래스를 사용할 수 있습니다 [^[:cntrl:]] 제어가 아닌 문자와 일치합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top