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
正则表达式中的字符类匹配字符而不是字节,并与Unicode属性数据库中指定的字符属性匹配.
\w例如,可用于匹配日语表意文字.
所以看起来你的问题的答案是肯定的.
但是,您可能希望使用该\p{}构造直接访问特定的Unicode字符属性.您可以使用\p{L}(或更短\pL)字母和\pN数字,并且更自信地获得您想要的内容.
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在正则表达式有任何以下四种性质的任何单码点相匹配:
\p{GC=Alphabetic}\p{GC=Mark}\p{GC=Connector_Punctuation}\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吗?:)