Perl:如何匹配FULLWIDTH LATIN SMALL

时间:2013-05-09 20:17:04

标签: regex perl unicode character-properties

我正在使用listadmin来管理许多基于邮件的邮件列表。我有很长的主题列表和设置阻止垃圾邮件的地址。最近,我收到了更聪明的垃圾邮件,因为它使用了漂亮的Unicode字符,例如:

  

主题:你看到的广告没什么特别的   ompari-             我们的exx xi汇编了13,000个高清动画             现在,你可以随意使用!

  

拍摄对象:高清拍摄视频和图像以了解图像            在这里为你

现在我想使用智能Perl正则表达式来阻止它。将这些主题管道化为hexdump显示许多字符是FULLWIDTH LATIN SMALL LETTER。但是,\p{FULLWIDTH LATIN SMALL LETTER}不起作用:Can't find Unicode property definition "FULLWIDTH LATIN SMALL LETTER"

所以问题是:是否有\p{something}匹配这些全角字符?另外:还有另一种匹配这些角色的方法吗?

2 个答案:

答案 0 :(得分:8)

页面perlunicode记录了可用的unicode字符类。我在perlrebackslash中找到它作为参考,它在正则表达式中记录特殊字符类和反斜杠序列,如\p{...}

摘要是除了最常见的属性类之外的所有属性类都需要属性类型和属性值,它们由:=分隔。但是,似乎没有提到全宽字符作为预定义属性。

但有Block / Blk属性,可以Halfwidth 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}

答案 1 :(得分: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";