我正在寻找一种只匹配Unicode字符串中完全组成的字符的方法。
在包含此字符类的任何正则表达式实现中,[:print:]是否依赖于区域设置?例如,它是否会匹配日语字符'あ',因为它不是控制字符,或者[:print:]将始终是ASCII码0x20到0x7E?
有没有任何字符类,包括Perl REs,可以用来匹配除控制字符之外的任何字符?如果[:print:]只包含ASCII码范围内的字符,我会假设[:cntrl:]也包含。
发布于 2008-10-15 05:27:30
echo あ| perl -nle 'BEGIN{binmode STDIN,":utf8"} print"[$_]"; print /[[:print:]]/ ? "YES" : "NO"'这在很大程度上是有效的,尽管它会生成一个关于宽字符的警告。但是它给了你一个想法:你必须确保你处理的是一个真正的unicode字符串(检查utf8::is_utf8)。或者干脆看看perlunicode --整个话题还是让我头晕目眩。
发布于 2008-10-15 06:48:26
我认为你不需要或者不需要这样的语言环境,但是,你可以使用Unicode。如果你解码了一个文本字符串,\w将匹配任何语言的单词字符,\d不仅匹配0..9,还匹配每个Unicode数字等等。在正则表达式中,你可以用\p{PropertyName}查询Unicode属性。对您来说特别有趣的可能是\p{Print}。Here's a list of all the available Unicode character properties。
我写了一个article about the basics and subtleties of Unicode and Perl,它会让你知道该怎么做,这样perl会把你的字符串识别成一个字符序列,而不仅仅是一个字节序列。
更新:使用Unicode,你不会得到依赖于语言的行为,而是与语言无关的合理的默认行为。这可能是你想要的,也可能不是你想要的,但为了区分原生/控制字符,我不明白为什么你需要语言相关的行为。
发布于 2010-01-08 07:12:48
\X匹配完全组成的字符(序列)。证明:
#!/usr/bin/env perl
use 5.010;
use utf8;
use Encode qw(encode_utf8);
for my $string (qw(あ ご ご), "\x{3099}") {
say encode_utf8 sprintf "%s $string", $string =~ /\A \X \z/msx ? 'ok' : 'nok';
}测试数据是:一个普通字符,一个预组合字符,一个组合字符序列和一个组合字符(它本身“不计算”,是Unicode第三章的简化)。
将\X替换为[[:print:]],可以看到Tanktalus的答案为最后两种情况生成了错误匹配。
https://stackoverflow.com/questions/203605
复制相似问题