2013-05-09 5 views
6

많은 우편 발송자 기반 메일 링리스트를 관리하기 위해 listadmin을 사용하고 있습니다. 스팸을 차단하기 위해 긴 제목 목록과 주소에서 설정했습니다.Perl : 일치하는 방법 FULLWIDTH LATIN SMALL

주제 : 최근에, 나는 잘 생긴 유니 코드 문자, 예를 들어, 사용하는 의미에서 스마트 스팸 메일을받은 알 리터를 광고 ULT MOV 당신은 우리의 EXX에 ompari- NG C 레즈 아무것도 볼했습니다 '이거 야 HD로 13,000 곡의 동영상 편집하기 지금은 사용 가능합니다!

또는

제목 : HD ...로서이 VI 그래프하는 D 포를 EOS d는 Y 조명 S O F
는 U

여기있다 HO TC HIC KS는 이제 원하는 똑똑한 Perl 정규 표현식을 사용하여이를 막아라. hexdump에이 피사체를 파이핑하면 많은 문자가 FULLWIDTH LATIN SMALL LETTER입니다. 그러나 \p{FULLWIDTH LATIN SMALL LETTER}이 작동하지 않습니다. Can't find Unicode property definition "FULLWIDTH LATIN SMALL LETTER"

그래서 질문은 다음과 같습니다. \p{something}은 이러한 전각 문자와 일치합니까? 또는 그 문자를 일치시키는 다른 방법이 있습니까?

답변

8

perlunicode 페이지는 사용 가능한 유니 코드 문자 클래스를 문서화합니다. 나는 정규 표현식에서 \p{...}과 같은 특수 문자 클래스와 백 슬래시 시퀀스를 문서화하는 perlrebackslash에서 참조로 발견했습니다.

요약하면 가장 일반적인 속성 클래스를 제외한 모든 속성 유형과 속성 값은 : 또는 =으로 구분됩니다. 그러나 미리 정의 된 속성으로 전각 문자에 대한 언급이없는 것 같습니다.

그러나 Halfwidth and Fullwidth Forms (U+FF00 - U+FFEF) 가질 수있는 Block/Blk 속성이 값을 :

/\p{Block=Halfwidth and Fullwidth Forms}/ 

이 귀하의 의견에 일치합니다 (v16.3에서 테스트가).


유용한 도구는 uniprops입니다.

$ uniprops U+FF41 
U+FF41 ‹a› \N{FULLWIDTH LATIN SMALL LETTER A} 
    \w \pL \p{LC} \p{L_} \p{L&} \p{Ll} 
    All Any Alnum Alpha Alphabetic Assigned InHalfwidthAndFullwidthForms 
    Cased Cased_Letter LC Changes_When_Casemapped CWCM 
    Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT 
    Changes_When_Uppercased CWU Ll L Gr_Base Grapheme_Base Graph GrBase 
    Halfwidth_And_Fullwidth_Forms Hex XDigit Hex_Digit ID_Continue IDC 
    ID_Start IDS Letter L_ Latin Latn Lowercase_Letter Lower Lowercase 
    Print Word XID_Continue XIDC XID_Start XIDS X_POSIX_Alnum 
    X_POSIX_Alpha X_POSIX_Graph X_POSIX_Lower X_POSIX_Print X_POSIX_Word 
    X_POSIX_XDigit 

당신이 볼 수 있듯이

, \p{Block=Halfwidth and Fullwidth Forms}\p{In Halfwidth and Fullwidth Forms}를 기록 할 수 있습니다.

+0

많은 감사의 @ikegami을 계몽 편집하고 연결된 엔터테인먼트 모듈. – amon

+0

그것은 tchrist 's 중 하나입니다. 'unichars'는 그 반대를하기 위해 사용될 수 있습니다. 예 : 'unichars -au '\ p {InHalfwidthAndFullwidthForms}'는 HalfwidthAndFullwidthForms 블록에 문자를 나열합니다. – ikegami

4

당신은 자신의 코드에서 문자 이름을 얻을 수 charnames::viacode를 사용할 수 있습니다

#!/usr/bin/perl 
use warnings; 
use strict; 
use utf8; 

use charnames qw(); 


my $string = q(Subject: Al l the ad ult mov ies you' ve see n a r e nothing) 
      .q(c ompari- ng t o our exx xci t i ng compilation of 13' 000) 
      .q(mov ies in HD t hat are a v ailable for y ou now!); 

my $count = grep /FULLWIDTH/, map charnames::viacode(ord), split //, $string; 
print "$count fullwidth characters.\n";