2013-03-11 100 views
0

我有以下regexp檢查XML元素名稱。perl正則表達式無效範圍

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 

在我使用\N{U+2FF}形式的字符的Perl 5.16.2。但我必須使用5.8.8。

編輯: 將qw更改爲不會改變錯誤的qr。 並添加了Unicode character 0xeffff is illegal at ...

編輯:來自ikegami的評論 刪除qr /消除迴文字符錯誤。

+3

另外:爲什麼使用'qw /.../'?這是創建列表的結構。 – mob 2013-03-11 17:21:58

+0

所以你說你得到5.8.8錯誤,而不是5.16.2,你想......究竟是什麼? – ikegami 2013-03-11 17:39:40

+2

'\ x {F8} - \ x {FF} \ x {100} - \ x {2FF}'? – ikegami 2013-03-11 17:53:43

回答

2

[\x{F8}-\x{2FF}]應該工作,所以這是Perl中的一個錯誤。

[\x{F8}-\x{2FF}]可以在更新版本的Perl中工作,所以這個bug已經修復。

看起來像正則表達式引擎有範圍從單字節字符到大字符的問題,所以爲什麼不嘗試將範圍分成兩部分。

[\x{F8}-\x{FF}\x{100}-\x{2FF}]