为什么[^w]匹配某些单词字符而不匹配[^p{word}]



我编写了一个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支持是一个巨大的主题,请参阅例如这个答案

为了使wp{Word}匹配,您需要使/u字符集修饰符生效(从5.14版本开始在Perl中可用)

最简单的方法是使用启动程序

use v5.14;

它(除其他外)启用特性CCD_ 11并使所有正则表达式默认为CCD_。您也可以显式启用该功能:

use feature 'unicode_strings';

第三种方法是使用正则表达式中修改的/u在每个正则表达式的基础上更改字符集。

您可以从perlre手册页中了解不同regex字符集修饰符的效果。它们是/d/u/a/l

w在perlrecharclass手册页中进行了说明。

最新更新