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

kno*_*orv 11 regex unicode perl internationalization character-properties

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+$/);
}
Run Code Online (Sandbox Code Playgroud)

Can*_*ice 14

perldoc perlunicode

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

所以看起来你的问题的答案是肯定的.

但是,您可能希望使用该\p{}构造直接访问特定的Unicode字符属性.您可以使用\p{L}(或更短\pL)字母和\pN数字,并且更自信地获得您想要的内容.

  • 请注意,这取决于字符语义; 如果你的字符串来自使用字节语义的源,`\ w`将只匹配ASCII字符. (4认同)
  • 有关Unicode字符语义的更多详细信息,请参阅[perlunicode中的Unicode错误](http://perldoc.perl.org/perlunicode.html#The-%22Unicode-Bug%22).相当于`\ w`的安全是使用`\ p {Alnum}`. (2认同)
  • @cjm,`\w` 实际上是 `\p{Word}`。`\p{Alnum}` 缺少下划线。 (2认同)
  • @cjm:Perl 5.14将Unicode Bug放置. (2认同)

tch*_*ist 11

是的,不是.

如果你想要所有的字母数字,你想要的[\p{Alphabetic}\p{GC=Number}].在\w同时包含比这更少.它特别排除任何\pN其不是\p{Nd}也不\p{Nl}一样,上标,下标,和分数.那些是\p{GC=Other_Number},并且不包括在内\w.

因为不像大多数正则表达式系统,Perl,以符合要求1.2A,"兼容性属性"UTS#Unicode的正则表达式18,那么假设你有Unicode字符串,一个\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}属性而不是普通的\p{Digit}.那是因为它被认为是\p{Other_Number}\p{No}.但是,它确实具有\p{Numeric_Value=2}您想象的属性.

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

字母表包含的内容远远不止\p{Other_Alphabetic}于此,所有这些都归因于属性,因为这又包括一些但不是全部\p{GC=Mark},所有\p{Lowercase}(\p{GC=Ll}因为它添加的不同\p{Other_Lowercase})和所有\p{Uppercase}(\p{GC=Lu}因为它添加的不同\p{Other_Uppercase}) .

这就是它\p{GC=Letter_Number}如罗马数字以及所有带圆圈的字母所带来的类型\p{Other_Symbol}和类型\p{Block=Enclosed_Alphanumerics}.

你不高兴我们开始使用\w吗?:)