如果不循环遍历整个Unicode字符范围,我如何获得具有给定属性的字符列表?特别是我想要一个包含数字的所有字符的列表(即那些匹配/\d/
的字符)。我查看了Unicode::UCD
,它对于确定给定字符的属性很有用,但似乎没有办法获得具有该属性的列表字符。
答案 0 :(得分:6)
编译Perl时,每个类的Unicode字符列表都是从Unicode规范生成的,通常存储在/ usr / lib / perl-YOURPERLVERSION / unicore / lib / gc_sc /
中例如,与IsDigit(a.k.a。\ d)匹配的Unicode字符范围列表存储在文件/usr/lib/perl-YOURPERLVERSION/unicore/lib/gc_sc/Digit.pl
中答案 1 :(得分:1)
比unicore/lib/gc_sc/Digit.pl
更好unicore/To/Digit.pl
。它是将Unicode数字字符(实际上是它们的偏移)直接映射到它们的数值。这意味着代替:
use Unicode::Digits qw/digit_to_int/;
my @digits;
for (split "\n", require "unicore/lib/gc_sc/Digit.pl") {
my ($s, $e) = map hex, split;
for (my $ord = $s; $ord <= $e; $ord++) {
my $chr = chr $ord;
push @{$digits[digits_to_int $chr]}, $chr;
}
}
for my $i (0 .. 9) {
my $re = join '', "[", @{$digits[$i]}, "]";
$digits[$i] = qr/$re/;
}
我可以说:
my @digits;
for (split "\n", require "unicore/To/Digit.pl") {
my ($ord, $val) = split;
my $chr = chr hex $ord;
push @{$digits[$val]}, $chr;
}
for my $i (0 .. 9) {
my $re = join '', "[", @{$digits[$i]}, "]";
$digits[$i] = qr/$re/;
}
甚至更好:
my @digits;
for (split "\n", require "unicore/To/Digit.pl") {
my ($ord, $val) = split;
$digits[$val] .= "\\x{$ord}";
}
@digits = map { qr/[$_]/ } @digits;
答案 2 :(得分:0)
哪些字符/ \ d /匹配完全取决于您的正则表达式实现(尽管标准0-9是有保证的)。在perl的情况下,使用的perl locale定义哪些字符被认为是字母和数字。
答案 3 :(得分:0)
如果不迭代所有角色,就没有办法做到这一点。 (如果你创建一个包含所有这些字符串并使用正则表达式的巨大字符串,你仍然必须至少进行一次循环,以创建字符串。)