在不遍历整个 Unicode 字符范围的情况下,如何获取具有给定属性的字符列表?特别是我想要一个所有数字字符的列表(即匹配的那些/\d/
)。我看过Unicode::UCD
,它对于确定给定字符的属性很有用,但似乎没有办法获取具有属性的字符列表。
问问题
1476 次
4 回答
6
每个类的 Unicode 字符列表是在编译 Perl 时从 Unicode 规范生成的,通常存储在 /usr/lib/perl-YOURPERLVERSION/unicore/lib/gc_sc/
例如,匹配 IsDigit(又名 \d)的 Unicode 字符范围列表存储在文件 /usr/lib/perl-YOURPERLVERSION/unicore/lib/gc_sc/Digit.pl
于 2009-07-25T16:51:25.460 回答
1
甚至比unicore/lib/gc_sc/Digit.pl
is还要好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;
于 2009-07-25T20:12:01.000 回答
0
哪些字符 /\d/ 匹配完全取决于您的正则表达式实现(尽管保证标准 0-9)。在 perl 的情况下,使用的perl 语言环境定义了哪些字符被认为是字母和数字。
于 2009-07-25T16:28:39.420 回答
0
如果不遍历所有字符,就没有办法做到这一点。(如果您使用所有这些创建一个巨大的字符串并使用正则表达式,您仍然必须至少执行一次循环才能创建字符串)。
于 2009-07-25T18:02:06.767 回答