2013-05-09 13 views
6

多くのmailmanベースのメーリングリストを管理するのにlistadminを使用しています。私は長い件名リストとアドレスからスパムをブロックするように設定しています。Perl:FULLWIDTH LATIN SMALLに一致する方法

件名::最近、私はそれは見栄えの良いUnicode文字、例えば使用するという意味で、よりスマートなスパムを受け取ったAlリットルを広告ULT MOVあなたは私たちのEXXへ ompari- NG C鼻孔何も見えない「VEのIES HDで13,000のムービーを編集すると、 は今のところ利用できます!

または

件名:HDの資格は、viはグラフ化するDのフォーをEOS D Yを点灯して、S、O、F
をu

のためにここにいるホ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には、利用可能なユニコード文字クラスが記載されています。私はperlrebackslashのリファレンスとしてそれを見つけました。特殊文字クラスと正規表現の\p{...}のようなバックスラッシュシーケンスを文書化しています。

最も一般的なプロパティクラスを除くすべてのプロパティクラスは、プロパティタイプとプロパティ値を必要とし、これらの値は:または=で区切られています。ただし、事前定義されたプロパティとしてフルサイズの文字には言及していないようです。

しかしBlock/BlkHalfwidth and Fullwidth FormsU+FF00 - U+FFEF)を持つことができるプロパティがあり、値として:

/\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

それはチクリストの一つです。その逆を行うために '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";