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

jm6*_*666 7 unicode perl

有这个脚本:

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)


Tan*_*lus 5

这也适用于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文档.

  • 您可能想要扩展其工作原理和方法. (2认同)