有这个脚本:
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";
Run Code Online (Sandbox Code Playgroud)
可以组合多个unicode属性吗?例如,如何选择Upper and Greek
,并得到想要的:
Greek: ? ? ? ? ? ?
Upper: X Y Z ? ? ?
Upper+Greek: ? ? ? #<-- how to get this?
Run Code Online (Sandbox Code Playgroud)
ike*_*ami 10
我们不能用
/(?:\p{Greek}|\p{Upper})/ # Greek OR Upper
Run Code Online (Sandbox Code Playgroud)
要么
/[\p{Greek}\p{Upper}]/ # Greek OR Upper
Run Code Online (Sandbox Code Playgroud)
在正则表达式中实现AND的一种方法是使用外观.
/\p{Greek}(?<=\p{Upper})/ # Greek AND Upper
Run Code Online (Sandbox Code Playgroud)
获得AND的另一种方法是否定OR.德摩根的法律告诉我们
NOT( Greek AND Upper ) ? NOT(Greek) OR NOT(Upper)
Run Code Online (Sandbox Code Playgroud)
所以
Greek AND Upper ? NOT( NOT(Greek) OR NOT(Upper) )
Run Code Online (Sandbox Code Playgroud)
这给了我们
/[^\P{Greek}\P{Upper}]/ # Greek AND Upper
Run Code Online (Sandbox Code Playgroud)
从5.18开始,您还可以使用以下实验性功能:
no warnings qw( experimental::regex_sets );
/(?[ \p{Greek} & \p{Upper} ])/ # Greek AND Upper
Run Code Online (Sandbox Code Playgroud)
这也适用于5.14.0:
sub InUpperGreek {
return <<'END'
+utf8::Greek
&utf8::Upper
END
}
my @upper_greek = ($str =~ /\p{InUpperGreek}/g);
say "Upper Greek: @upper_greek";
Run Code Online (Sandbox Code Playgroud)
不确定这是否更简单.:)有关其工作原理的更多信息,请参阅有关用户定义字符属性的perlunicode文档.