3

この質問に答えるとき、文字列内の UTF-8 バイト シーケンスを反復処理する次のコードを書きました。

local str = "KORYTNAČKA"
for c in str:gmatch("[\0-\x7F\xC2-\xF4][\x80-\xBF]*") do 
    print(c) 
end

Lua 5.2 では動作しますが、Lua 5.1 ではエラーが報告されます。

不正なパターン (「]」がありません)

Lua 5.1 では文字列リテラルがサポートされていなかったことを思い出した\xhhので、次のように変更しました。

local str = "KORYTNAČKA"
for c in str:gmatch("[\0-\127\194-\244][\128-\191]*") do 
    print(c) 
end

しかし、エラーは同じままです。どうすれば修正できますか?

4

2 に答える 2

3

私は非常に疑っていますが、これ\0はパターンが原因で発生します。基本的に、パターンを保持する文字列は、必要になる前に null で終了します。実際、lua 正規表現エンジンが解析しているのは: [\0. これは明らかに間違ったパターンであり、現在発生しているエラーを引き起こすはずです。

この概念を証明するために、パターンを少し変更しました。

local str = "KORYTNAČKA"
for c in str:gmatch("[\x0-\x7F\xC2-\xF4][\x80-\xBF]*") do 
    print(c) 
end

これは、lua 5.1.4 で期待どおりにコンパイルおよび実行されました。デモンストレーション

注:実際にどのパターンが実行されているかは確認していません。\0を追加するだけで削除されxます。したがって、変更されたコードの出力は、期待したものとは異なる場合があります。

編集:回避策として、 2 番目のコード例\0で(null 終了をエスケープするために) に置き換えることを検討してください。\\0

local str = "KORYTNAČKA"
for c in str:gmatch("[\\0-\127\194-\244][\128-\191]*") do 
    print(c) 
end

デモ

于 2014-04-09T08:10:08.400 に答える