7

listadminを使用して、多くの mailman ベースのメーリング リストを管理しています。件名の長いリストと、スパムをブロックするように設定された差出人アドレスがあります。最近、見栄えの良い Unicode 文字を使用しているという意味で、よりスマートなスパムを受け取りました。

件名: あなたが今までに見たすべてのアダルト映画は、あなたが今利用できる HD の 13' 000 映画の exx エキサイティングな編集に匹敵するものは何もありません!

また

件名: HD 品質のビデオと写真のグラフ s o tchic ks <br> はこちら

これをブロックするために、スマートな Perl 正規表現を使用したいと考えています。これらのサブジェクトを hexdump にパイプすると、多くの文字がFULLWIDTH LATIN SMALL LETTERであることが明らかになりました。ただし、\p{FULLWIDTH LATIN SMALL LETTER}機能しません:Can't find Unicode property definition "FULLWIDTH LATIN SMALL LETTER"

問題は、\p{something}これらの全角文字に一致する があるかどうかです。あるいは、これらの文字を一致させる別の方法はありますか?

4

2 に答える 2

9

このページには、perlunicode使用可能な Unicode 文字クラスが記載されています。これは、正規表現のような特殊文字クラスとバックスラッシュ シーケンスを説明する perlrebackslash のリファレンスとして見つかりました\p{...}

要約すると、最も一般的なプロパティ クラスを除くすべてのプロパティ クラスは、:またはで区切られたプロパティ タイプとプロパティ値を必要とします=。ただし、定義済みのプロパティとして全角文字についての言及はないようです。

しかし、値として( –<code>U+FFEF) を持つことができるBlock/Blkプロパティがあります:Halfwidth and Fullwidth FormsU+FF00

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

于 2013-05-09T20:34:02.803 に答える
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";
于 2013-05-09T20:34:12.880 に答える