如何在perl正则表达式中组合多个Unicode属性?

有这个脚本:

use 5.014;
use warnings;

use utf8;    
binmode STDOUT, ':utf8';

my $str = "XYZ ΦΨΩ zyz φψω";

my @greek = ($str =~ /\p{Greek}/g);
say "Greek: @greek";

my @upper = ($str =~ /\p{Upper}/g);
say "Upper: @upper";

#my @upper_greek = ($str =~ /\p{Upper+Greek}/); #wrong.
#say "Upper+Greek: @upper_greek";

可以组合多个unicode属性吗?例如,如何只选择Upper和Greek,并得到想要的:

Greek: Φ Ψ Ω φ ψ ω
Upper: X Y Z Φ Ψ Ω
Upper+Greek: Φ Ψ Ω      #<-- how to get this?
我们不能用

/(?:\p{Greek}|\p{Upper})/         # Greek OR Upper

要么

/[\p{Greek}\p{Upper}]/            # Greek OR Upper

在正则表达式中实现AND的一种方法是使用外观.

/\p{Greek}(?<=\p{Upper})/         # Greek AND Upper

获得AND的另一种方法是否定OR. De Morgan’s laws告诉我们

NOT( Greek AND Upper )  ⇔  NOT(Greek) OR NOT(Upper)

所以

Greek AND Upper  ⇔  NOT( NOT(Greek) OR NOT(Upper) )

这给了我们

/[^\P{Greek}\P{Upper}]/           # Greek AND Upper

从5.18开始,您还可以使用以下实验性功能:

no warnings qw( experimental::regex_sets );
/(?[ \p{Greek} & \p{Upper} ])/    # Greek AND Upper
相关文章
相关标签/搜索