有这个脚本:
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