7

Unicode文字の全範囲をループせずに、特定のプロパティを持つ文字のリストを取得するにはどうすればよいですか?特に、数字であるすべての文字(つまり、一致する文字/\d/)のリストが必要です。を見てきましたUnicode::UCDが、特定の文字のプロパティを決定するのに役立ちますが、プロパティを持つリスト文字を取得する方法はないようです。

4

4 に答える 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よりもさらに優れてい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 に答える