我编写了一个打印出与Unicode属性匹配的字符的Perl脚本。到目前为止,它似乎对大多数房产都有效。
但它在匹配ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ
ÿ
的字符中打印出[^\w]
。这些字符应该与\w
匹配。奇怪的是,它们匹配\p{Word}
。
我尝试过没有成功:
map { decode ( "UTF-8", $_ ) }
map { pack 'U0C*', unpack 'C*', $_ }
如何使[^\w]
与这些字符不匹配?
#!/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
答案 0 :(得分:12)
Perl中的Unicode支持是一个很大的主题,请参阅例如this answer
要使& "cmd.exe /c C:\Batchfiles\$batfilename"
与\w
相匹配,您需要生效\p{Word}
字符集修饰符(自版本5.14起在Perl中可用)。
最简单的方法是用
启动程序/u
(除其他外)启用功能use v5.14;
并使所有正则表达式默认为unicode_strings
字符集修饰符。您也可以明确启用该功能:
/u
第三种方法是使用正则表达式中修改的use feature 'unicode_strings';
来改变每个正则表达式的字符集。
您可以从perlre联机帮助页中了解不同正则表达式字符集修饰符的效果。这些是/u
,/d
,/u
和/a
。
perlrecharclass联机帮助页中解释了/l
。