20

Perl 是否\w匹配 Unicode 标准中定义的所有字母数字字符?

例如,将\w匹配所有(比如说)中文和俄文字母数字字符?

我编写了一个简单的测试脚本(见下文),它表明\w确实与我测试的非 ASCII 字母数字字符“按预期”匹配。但测试显然远非详尽无遗。

#!/usr/bin/perl                                                                                                                                                                                                  

use utf8;

binmode(STDOUT, ':utf8');

my @ok;
$ok[0] = "abcdefghijklmnopqrstuvwxyz";
$ok[1] = "éèëáàåäöčśžłíżńęøáýąóæšćôı";
$ok[2] = "şźüęłâi̇ółńśłŕíáυσνχατςęςη";
$ok[3] = "τσιαιγολοχβςανنيرحبالтераб";
$ok[4] = "иневоаслкłјиневоцедањеволс";
$ok[5] = "рглсывызтоμςόκιναςόγο";

foreach my $ok (@ok) {
    die unless ($ok =~ /^\w+$/);
}
4

3 回答 3

19

perldoc perlunicode

正则表达式中的字符类匹配字符而不是字节,并匹配 Unicode 属性数据库中指定的字符属性。\w例如,可用于匹配日语表意文字。

所以看起来你的问题的答案是“是”。

但是,您可能希望使用该\p{}构造直接访问特定的Unicode 字符属性。您可能可以使用\p{L}(或更短的,\pL)来表示字母和\pN数字,并且更加确信您会得到您想要的。

于 2011-04-05T17:12:51.073 回答
12

是和不是。

如果你想要所有的字母数字,你想要[\p{Alphabetic}\p{GC=Number}]. \w包含更多和更少。它特别排除了任何\pN\p{Nd}nor \p{Nl},如上标、下标和分数。那些是\p{GC=Other_Number},并且不包括在\w.

因为与大多数正则表达式系统不同,Perl 符合UTS #18 中关于 Unicode 正则表达式的Requirement 1.2a,“Compatibility Properties”</a>,然后假设您有 Unicode 字符串,正则表达式中的a匹配任何单个代码点,其中任何一个以下四个属性:\w

  1. \p{GC=Alphabetic}
  2. \p{GC=Mark}
  3. \p{GC=Connector_Punctuation}
  4. \p{GC=Decimal_Number}

上面的数字 4 可以用这些方式中的任何一种来表示,它们都被认为是等效的:

  • \p{Digit}
  • \p{General_Category=Decimal_Number}
  • \p{GC=Decimal_Number}
  • \p{Decimal_Number}
  • \p{Nd}
  • \p{Numeric_Type=Decimal}
  • \p{Nt=De}

请注意,\p{Digit}与 不一样\p{Numeric_Type=Digit}。例如,代码点 B2,SUPERSCRIPT TWO,只有\p{Numeric_Type=Digit}属性而不是 plain \p{Digit}。那是因为它被认为是\p{Other_Number}or \p{No}。但是,它确实具有\p{Numeric_Value=2}您想象的属性。

确实是上面的第1点\p{Alphabetic},给人们带来了最大的麻烦。那是因为他们经常错误地认为它与\p{Letter}( \pL) 相同,但事实并非如此。

Alphabetics 包括的远不止这些,都是因为\p{Other_Alphabetic}属性,因为这又包括some 但不是all \p{GC=Mark}, all of \p{Lowercase}(与\p{GC=Ll}添加\p{Other_Lowercase}不同)和 all of \p{Uppercase}(与\p{GC=Lu}添加不同\p{Other_Uppercase}) .

这就是它\p{GC=Letter_Number}像罗马数字和所有带圆圈的字母一样拉入的方式,它们的类型为\p{Other_Symbol}and \p{Block=Enclosed_Alphanumerics}

你不高兴我们可以使用\w吗?:)

于 2011-04-05T19:49:21.320 回答
2

特别是\w还匹配下划线字符。

#!/usr/bin/perl -w
$name = 'Arun_Kumar';
($name =~ /\w+/)? print "Underscore is a word character\n": print "No underscores\n";
$ underscore.pl 

下划线是一个单词字符。

于 2013-04-04T07:41:53.077 回答