首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Perl中只匹配Unicode字符串中的完全组成的字符?

如何在Perl中只匹配Unicode字符串中的完全组成的字符?
EN

Stack Overflow用户
提问于 2008-10-15 03:10:14
回答 5查看 2.2K关注 0票数 8

我正在寻找一种只匹配Unicode字符串中完全组成的字符的方法。

在包含此字符类的任何正则表达式实现中,[:print:]是否依赖于区域设置?例如,它是否会匹配日语字符'あ',因为它不是控制字符,或者[:print:]将始终是ASCII码0x20到0x7E?

有没有任何字符类,包括Perl REs,可以用来匹配除控制字符之外的任何字符?如果[:print:]只包含ASCII码范围内的字符,我会假设[:cntrl:]也包含。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-10-15 05:27:30

代码语言:javascript
复制
echo あ| perl -nle 'BEGIN{binmode STDIN,":utf8"} print"[$_]"; print /[[:print:]]/ ? "YES" : "NO"'

这在很大程度上是有效的,尽管它会生成一个关于宽字符的警告。但是它给了你一个想法:你必须确保你处理的是一个真正的unicode字符串(检查utf8::is_utf8)。或者干脆看看perlunicode --整个话题还是让我头晕目眩。

票数 6
EN

Stack Overflow用户

发布于 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,你不会得到依赖于语言的行为,而是与语言无关的合理的默认行为。这可能是你想要的,也可能不是你想要的,但为了区分原生/控制字符,我不明白为什么你需要语言相关的行为。

票数 5
EN

Stack Overflow用户

发布于 2010-01-08 07:12:48

\X匹配完全组成的字符(序列)。证明:

代码语言:javascript
复制
#!/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的答案为最后两种情况生成了错误匹配。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/203605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档