0

XML要素名をチェックするために次の正規表現があります。

my $NameStartChar = ':A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{0370}-\x{037D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}';
my $NameChar = ':A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}\-\.0-9\x{B7}\x{0300}-\x{036F}\x{203F}-\x{2040}';

sub checkXmlName ($)
# Check if input is valid XML name
# $arg - Input string
# $ret - Boolean of validity
{
    if ($_[0] =~ m/^[$NameStartChar]([$NameChar])*$/)
    {    return 1;    }
    else
    {    return "";    }
}

if (checkXmlName("foo"))
{
    print STDOUT "OK";
}

便利なエラーを与える

Invalid [] range "\x{F8}-\x{2FF}" in regex; marked by <-- HERE in m/^[:A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF} <-- HERE

Perl 5.16.2 では\N{U+2FF}、文字の形式を使用しています。ただし、5.8.8 を使用する必要があります。

編集: エラーを変更しない qw を qr に変更しました。と追加Unicode character 0xeffff is illegal at ...

編集: 池上のコメントから qr/ を削除しました。これにより、不正な文字エラーが解消されました。

4

1 に答える 1

2

[\x{F8}-\x{2FF}]動作するはずなので、これはPerlのバグです。

[\x{F8}-\x{2FF}]新しいバージョンのPerlで動作するため、このバグは修正されています。

正規表現エンジンには、1バイト文字からより大きな文字までの範囲に問題があるようです。範囲を2つに分割してみませんか。

[\x{F8}-\x{FF}\x{100}-\x{2FF}]
于 2013-03-11T20:39:35.510 に答える