我编写了一个Perl脚本,它打印出与Unicode属性匹配的字符。到目前为止,它似乎对大多数房产都适用。
但它打印出与[^w]
匹配的字符中的ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ
ÿ
。这些字符应该与w
匹配。奇怪的是,他们匹配p{Word}
。
我尝试过但没有成功:
map { decode ( "UTF-8", $_ ) }
map { pack 'U0C*', unpack 'C*', $_ }
如何使[^w]
与那些单词字符不匹配?
chars.pl
#!/usr/bin/perl
use warnings;
use strict;
use utf8;
binmode STDOUT, ':utf8';
my $c;
my $cols = 80;
my $arg = shift;
my $regex = qr/$arg/;
for ( map { chr } 0x20 .. 0xFFFF )
{
next if /p{Unassigned}|p{NChar}|p{Cs}/;
if ( $_ =~ $regex )
{
print STDOUT;
print STDOUT "n" if ++$c % $cols == 0;
}
}
print STDOUT "n" if defined $c and $c % $cols != 0;
exit 0;
好:
$ ./chars.pl 'p{Cyrillic}'
ЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя
ѐёђѓєѕіїјљњћќѝўџѠѡѢѣѤѥѦѧѨѩѪѫѬѭѮѯѰѱѲѳѴѵѶѷѸѹѺѻѼѽѾѿҀҁ҂҃҄҇ҊҋҌҍҎҏҐґҒғҔҕҖҗҘҙҚқҜҝҞҟҠҡ
ҢңҤҥҦҧҨҩҪҫҬҭҮүҰұҲҳҴҵҶҷҸҹҺһҼҽҾҿӀӁӂӃӄӅӆӇӈӉӊӋӌӍӎӏӐӑӒӓӔӕӖӗӘәӚӛӜӝӞӟӠӡӢӣӤӥӦӧӨөӪӫӬӭӮӯӰӱ
ӲӳӴӵӶӷӸӹӺӻӼӽӾӿԀԁԂԃԄԅԆԇԈԉԊԋԌԍԎԏԐԑԒԓԔԕԖԗԘԙԚԛԜԝԞԟԠԡԢԣԤԥԦԧᴫᵸⷠⷡⷢⷣⷤⷥⷦⷧⷨⷩⷪⷫⷬⷭⷮⷯⷰⷱⷲⷳⷴⷵⷶⷷ
ⷸⷹⷺⷻⷼⷽⷾⷿꙀꙁꙂꙃꙄꙅꙆꙇꙈꙉꙊꙋꙌꙍꙎꙏꙐꙑꙒꙓꙔꙕꙖꙗꙘꙙꙚꙛꙜꙝꙞꙟꙠꙡꙢꙣꙤꙥꙦꙧꙨꙩꙪꙫꙬꙭꙮ꙯꙰꙱꙲꙳꙼꙽꙾ꙿꚀꚁꚂꚃꚄꚅꚆꚇꚈꚉꚊꚋꚌꚍꚎꚏ
ꚐꚑꚒꚓꚔꚕꚖꚗ
$
好:
$ ./chars.pl '[^p{Word}]' | grep É
$
错误:
$ ./chars.pl '[^w]' | grep É
°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ
$
Perl v5.14.2
Perl中的Unicode支持是一个巨大的主题,请参阅例如这个答案
为了使w
和p{Word}
匹配,您需要使/u
字符集修饰符生效(从5.14版本开始在Perl中可用)
最简单的方法是使用启动程序
use v5.14;
它(除其他外)启用特性CCD_ 11并使所有正则表达式默认为CCD_。您也可以显式启用该功能:
use feature 'unicode_strings';
第三种方法是使用正则表达式中修改的/u
在每个正则表达式的基础上更改字符集。
您可以从perlre手册页中了解不同regex字符集修饰符的效果。它们是/d
、/u
、/a
和/l
。
w
在perlrecharclass手册页中进行了说明。